Я издевался над TranslateService следующим образом:
import { EventEmitter } from '@angular/core';
import { LangChangeEvent } from '@ngx-translate/core';
export class MockTranslateService {
onLangChange = new EventEmitter<LangChangeEvent>();
setDefaultLang(lang: string) { }
use(lang: string) {
this.onLangChange.emit({lang: lang} as LangChangeEvent);
}
}
Это метод ngOnInit моего app.component, который я пытаюсь проверить:
ngOnInit() {
this.translateService.setDefaultLang('en');
this.translateService.onLangChange.subscribe((langChangeEvent: LangChangeEvent) => {
this.localStorageService.setItem(LocalStorageService.languageKey, langChangeEvent.lang);
});
}
И этотест, который я написал для ngOnInit в app.component.spec.ts, чтобы проверить, сохраняет ли ngOnInit язык в локальном хранилище:
describe('ngOnInit', () => {
it('should set new lang key to localStorageService on TranslateService.onLangChange observable emit', () => {
const localStorageService = fixture.debugElement.injector.get(LocalStorageService);
const translateService = fixture.debugElement.injector.get(TranslateService);
spyOn(localStorageService, 'setItem');
spyOn(translateService.onLangChange, 'emit');
component.ngOnInit();
translateService.onLangChange.emit({lang: 'de'}); <----- Shouldn't this have triggered the subscription callback in the ngOnInit of the component?
expect(translateService.onLangChange.emit).toHaveBeenCalled();
fixture.detectChanges();
expect(localStorageService.setItem).toHaveBeenCalledWith(LocalStorageService.languageKey, 'de');
});
});
Это результат этого теста:
Я не понимаю.Если в тесте я вызываю emit EventEmitter, разве это не должно вызывать подписку в компоненте?