Угловой неглубокий модульный тест InvalidPipeArgument с асинхронной трубой

#typescript #jasmine #angular11

Вопрос:

Я пытаюсь написать простой тест на угловом языке с неглубокой визуализацией. Я использую асинхронный канал в шаблоне html для визуализации наблюдаемого. Я продолжаю получать следующую ошибку:

 Error: InvalidPipeArgument: '() => this.referenceDataService.getRoutes() 
    .pipe(Object(rxjs_operators__WEBPACK_IMPORTED_MODULE_5__["map"])((routes) => {​​​ debugger; return routes || []; }​​​))' for pipe 'AsyncPipe'
 

Компонент:

 routes$: Observable<RouteModel[]>;
   routes$ = () => this.referenceDataService.getRoutes()
    .pipe(map((routes: RouteModel[]) => {
        debugger;
        return routes || [];
    }));
 

тест:

 beforeEach(() => {
    routes = [
        { routeId: 1, prefix:'/test1', route:'/test1' }, 
        { routeId: 2, prefix:'/test2', route:'/test2' }
    ]

    dataServiceMock = {
        getRoutes: () => of(routes)
    };

    shallowComponent = new Shallow(RouteComponent, AppModule)
    .provideMock([
        { provide: ReferenceDataService, useValue: dataServiceMock}
    ])
    .dontMock([FormBuilder]);
});

it('should create',  async () => {
    const { instance } = await shallowComponent.render();
    expect(instance).toBeTruthy();
});
 

Кто-нибудь может, пожалуйста, помочь мне, в чем проблема?

Спасибо

Ответ №1:

Работает ли код, когда вы это делаете npm start ?

Проблема в () том , async что канал может привязываться только к Observable функции, а не к функции, которая возвращает Observable значение, если только вы не вызовете эту функцию в HTML, что не рекомендуется, потому что это замедлит приложение, потому что функция будет вызываться каждый раз, когда выполняется обнаружение изменений.

Попробуйте это:

 // get rid of the () =>
routes$ = this.referenceDataService.getRoutes()
    .pipe(map((routes: RouteModel[]) => {
        debugger;
        return routes || [];
    }));