测试是否使用Jasmine正确设置了数据

时间:2019-10-15 09:25:50

标签: javascript jasmine karma-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,但这是服务而不是组件,因此使用它似乎并不正确。无论如何,我还是前沿测试的新手,所以我很想听听您会做些什么。

还是应该在同一测试中获得使用中的语言?由于还有其他方法,因此我想为每个测试而不是一个巨大的测试

1 个答案:

答案 0 :(得分:1)

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

await testee.load(lang);