Ошибка типа: ApplicationServiceMock.application $ .pipe не является функцией - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь протестировать компонент Angular 7, который имеет это в конструкторе

constructor(private store: ApplicationService) {
        this.store.application$.pipe(first()).subscribe(r => { this.application = r; });
    }

Теперь, когда я пытаюсь протестировать, я получаю ошибку

TypeError: ApplicationServiceMock.application$.pipe is not a function

Вот какЯ пытаюсь проверить

const ApplicationServiceMock= mock(ApplicationService);

.....

when(ApplicationServiceMock.application$.pipe()).thenResolve(Observable.of(Applications.ApplicationServiceDummy));

.....

providers: [
                    { provide: ApplicationService, useFactory: () => ApplicationServiceMock}
                ],

Я также пытался использовать jasmine.spy,но даже это не работает и выдает точно такую ​​же ошибку.Что я делаю не так или отсутствует здесь?

1 Ответ

0 голосов
/ 31 мая 2019

Я не знаю, что делает 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 () внутри вашего теста.

...