#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)
даже тогда, когда значение не имеет значения.