Как проверить lasValueFrom ответ и не получить сообщение: «нет элементов в последовательности» имя:»Ошибка»

#angular #rxjs #jestjs

Вопрос:

Я пытаюсь протестировать emptyBasket метод, и с тех пор, как я обновил устаревший toPromise() до lastValueFrom() (rxjs 7.1.0), я получаю только ошибку:

 message:'no elements in sequence'
name:'EmptyError'
 

Испытываемый метод:

     emptyBasket(): Promise<void> {
    return lastValueFrom(this.shoppingClient.emptyBasket()).then(() => this.store.dispatch(new EmptyBasket()));
}
 

Тест:

 it('should call emptyBasket on shoppingClient', (done) => {
            mockStore.dispatch = jest.fn();
            shoppingClientMock.prototype.emptyBasket = jest.fn().mockReturnValue(of());

            service.emptyBasket().then(() => {
                expect(shoppingClientMock.prototype.emptyBasket).toHaveBeenCalledTimes(1);
                expect(mockStore.dispatch).toHaveBeenCalledTimes(1);
                expect(mockStore.dispatch).toHaveBeenCalledWith(new EmptyBasket());
                done();
            },
            (err) => { 
                console.log('error', err)
                done();
        }
            );
        });
 

Кто-нибудь знает, как обойти эту проблему?

Большое спасибо!

Ответ №1:

Первое, что я заметил, это эта строка:

 shoppingClientMock.prototype.emptyBasket = jest.fn().mockReturnValue(of());
 

Когда вы используете просто of() , это эквивалентно использованию EMPTY . Другими словами, он просто выдает complete уведомление, и все. Однако lastValueFrom() возвращает обещание, а обещание должно быть решено со значением (это одно из основных различий между RxJS-наблюдениями и обещаниями). Так что ошибка верна.

Вы должны заставить его возвращать значение, например of(undefined) , или of(void 0) даже тогда, когда значение не имеет значения.