首页 > 解决方案 > 使用 Jasmine 测试数据是否正确设置

问题描述

我有服务:

import { EventEmitter, Injectable } from '@angular/core';

@Injectable()
export class LanguageService {
    protected activeLanguage = '';

    constructor(protected translateService: TranslateService) {
    }

    async load(userLanguage: string) {
        userLanguage = String(userLanguage).toLowerCase();
        this.activeLanguage = userLanguage;
        await this.translateService.use(this.activeLanguage).toPromise();
    }
    
    getActiveLanguage(): string[] {
        return this.activeLanguage;
    }
}

我想测试是否正确设置了活动语言。这就是我尝试这样做的方式:

import { TestBed, getTestBed } from '@angular/core/testing';
import { LanguageService } from './language.service';

fdescribe('LanguageService', () => {
    let injector: TestBed;
    let testee: LanguageService;

    beforeEach(async () => {
        TestBed.configureTestingModule({
           //...
        });
        injector = getTestBed();
        testee = injector.get(LanguageService);
    });

    it('should create', async () => {
        expect(testee).toBeTruthy();
    });

    it('should load configuration', async () => {
        const lang = 'en';
        const languageServiceSpy = spyOn(testee, 'load').and.callThrough();

        // make sure they haven't been called yet
        expect(languageServiceSpy).not.toHaveBeenCalled();

        testee.load(lang);
        expect(languageServiceSpy).toHaveBeenCalledTimes(1);
    });

    it('should return active language', async () => {
        const activeLanguage = testee.getActiveLanguage();
        expect(activeLanguage).toEqual('en');
});

但是,我的测试失败并出现错误Error: Expected '' to equal 'en'. 如何保留第一次测试的结果?

我知道ComponentFixture你可以在那里触发detectChanges,但这是服务,而不是组件,所以使用它似乎不正确。无论如何,我还是前端测试的新手,所以我很想听听你会做什么。

或者我应该在同一个测试中获得主动语言?由于还有其他方法,我希望每个测试都针对而不是一个巨大的测试

标签: javascriptjasminekarma-jasmine

解决方案


目前您LanguageService的每次都在中创建beforeEach,因此您应该在之前调用的测试中测试活动语言LanguageService#load。可能你还需要一个await在前面LanguageService#load

await testee.load(lang);

推荐阅读