Как написать модульный тест для эффекта, который через n раз вернет правильный ответ?
Я должен написать модульный тест для этого эффекта, который вызывает службу каждые 1 секунду, когда она пошла по ошибке. Например, мне нужно проверить, что после трехкратного вызова службы я получу хороший ответ.
Я попытался проверить, но безрезультатно.
Это эффект, который я должен проверить:
@Effect()
updateEffect$ = this.actions$.pipe(
ofType(featureActions.ActionTypes.UPDATE_PRODUCT),
switchMap((action: UpdateProduct) =>
this.productService.getProducts().pipe(
retryWhen((attempts) => attempts.pipe(delay(1000))),
map((productsResponse: Products) =>
productsResponse
? new featureActions.LoadProductSuccess(productsResponse)
: new featureActions.LoadProductError(productsResponse)
)
)
)
);
Это тестовый модуль, который я сделал, чтобы увидеть сценарий успеха. То, что я хочу проверить, это логика перезагрузки
it('should return UpdateProduct if service response success ', () => {
const action = new UpdateProduct('123456');
const completion = new LoadProductSuccess(productsResponseMock);
actions$ = hot('-a-', { a: action });
const response = cold('-b', { b: productsResponseMock });
const expected = cold('--c', { c: completion });
productService.getProducts.and.returnValue(response);
expect(effects.updateEffect$).toBeObservable(expected);
});
1 ответ
Прежде всего, это не юнит тест. Это интеграционный тест: он тестирует цепочку различных "модулей" (которые должны быть протестированы с помощью модульных тестов).
Во-вторых, ваш тестовый пример звучит довольно странно! Как вы можете гарантировать, что после 3 повторных попыток все получится?
Последнее, но не менее важное: извлеките свою логику повторных попыток и протестируйте ее как отдельный модуль. Извлеките логику обработки ошибок и проверьте, действительно ли она вызывает ваш "ретриер". И продолжайте извлекать юниты из цепочки, которую вы описали, и тестируйте их самостоятельно!
После того, как эти тесты пройдут, вы можете или не захотите написать интеграционный тест. Но это совсем другая история, которая почти не совпадает с юнит-тестированием.