Лично я не стал бы писать модульный тест для компонента, который затем проверял бы службу, используемую в этом компоненте.
Я написал бы непосредственно модульный тест для службы. А в компоненте я бы издевался над сервисом. При таком подходе мои модульные тесты выполняются намного быстрее. И они не сломаются из-за ошибки в сервисе. Только тесты сервисной единицы будут / должны сломаться. Это значительно упрощает анализ ошибок.
Но о вашей проблеме:
В своем коде вы пишете:
component.dialogService.dialogConfirmation();
spyOn(dialogservice, 'dialogConfirmation').and.callFake(() => {
return of(null);
});
Это содержит два fl aws.
Первый недостаток заключается в том, что метод вызывается FIRST, и только позже он изменяется, чтобы вызвать ложную реализацию. Сначала вам нужен шпион и перенаправить вызов метода, затем вы можете вызвать метод.
Второй недостаток заключается в том, что spyOn ожидает в качестве первого параметра объект, а затем в качестве второго параметра имя метода. В вашем примере кода он не получает объект (объект будет component.dialogService
).
Так что это должно быть
spyOn(component.dialogService, 'dialogConfirmation').and.callFake(() => {
return of(null);
});
component.dialogService.dialogConfirmation();
Кстати, вы можете сократить шпиона до
spyOn(component.dialogService, 'dialogConfirmation').and.return(of(null))
Возможно, еще одна вещь.
Когда вы подписываетесь на Observables, которые НЕ завершатся самостоятельно (вызовы http завершаются после первого выброса), то вы должны убедиться, что ваш компонент отписался, прежде чем он будет уничтожен. , Причина в том, что с «подпиской» вы регистрируете метод в Observable. Это означает, что, даже если ваш компонент долго отбрасывался go, этот метод все еще будет активен и будет выполняться с каждым излучением. Простой способ отменить подписку - добавить все подписки в объект подписки.
private subscriptions: Subscription = new Subscription();
// ...
this.subscriptions.add(
this.myService.myMethod.subscribe( ... )
);
this.subscriptions.add(
this.myOtherService.myOtherMethod.subscribe( ... )
)
ngOnDestroy(){
this.subscriptions.unsubscribe();
}