Angular: проверка выполнения обратного вызова подписки EventEmitter - PullRequest
0 голосов
/ 21 декабря 2018

Я издевался над 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');
});

}); 

Это результат этого теста:

enter image description here

Я не понимаю.Если в тесте я вызываю emit EventEmitter, разве это не должно вызывать подписку в компоненте?

1 Ответ

0 голосов
/ 21 декабря 2018

Проблема в том, что вы создаете spy:

spyOn(translateService.onLangChange, 'emit');

, этот шпион заменяет исходное событие выброса, и функция теперь работает только как шпион.Вам нужно изменить это значение на

spyOn(translateService.onLangChange, 'emit').and.callThrough();

, чтобы работала оригинальная emit функциональность EventEmitter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...