Я не знаю, что делает mock
. Но я бы предположил, что он создает только пустую оболочку для вашего ApplicationService. Вы должны сообщить своему шпиону или макету, что у него есть свойство с именем application$
, которое возвращает любое наблюдаемое.
Так что вам нужно что-то вроде этого:
const applicationServiceMock = {
application$: () => EMPTY
}
describe('AppComponent', () => {
let component: AppComponent;
let fixture: ComponentFixture<AppComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [AppComponent],
providers: [{provide: ApplicationService, useValue: applicationServiceMock}],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(AppComponent);
component = fixture.componentInstance;
});
it('should be created', () => {
fixture.detectChanges();
expect(component).toBeTruthy();
});
});
Поскольку вы обращаетесь к наблюдаемому внутри конструктора компонента, вам нужно определить ожидаемое наблюдаемое либо с EMPTY
, как я, либо с of(YOUR_TEST_VALUE_HERE)
внутри свойства mock заранее, потому что конструктор вызывается до того, как вы можете вмешаться внутри it
блок.
Если вы хотите использовать spyOn
, вам необходимо переместить код подписки из конструктора компонента в ловушку жизненного цикла ngOnInit
. Затем вы можете изменить заглушку и spyOn
перед вызовом первого fixture.detectChanges () внутри вашего теста.