Как написать модульный тест для эффекта, который после n раз возвращает правильный ответ?

Я должен написать модульный тест для этого эффекта, который вызывает сервис каждые 1 секунду, когда он идет по ошибке. Мне нужно проверить, например, что после 3-х раз звонков в службу я получу хороший ответ.

Я пробовал как-то протестировать, но безрезультатно.

Это эффект, который я должен проверить:

@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);
  });

person fedexo    schedule 07.06.2019    source источник
comment
модульные тесты не работают с apis или любой другой системой в этом отношении. пожалуйста, используйте правильные теги   -  person Andrei Dragotoniu    schedule 07.06.2019


Ответы (1)


Во-первых, это не юнит-тест. Это интеграционный тест: он проверяет цепочку различных «юнитов» (которые необходимо протестировать с помощью модульных тестов).

Во-вторых, ваш тестовый пример звучит довольно странно! Как вы можете гарантировать, что после 3-х попыток результат будет успешным?

И последнее, но не менее важное: извлеките логику повторных попыток и протестируйте ее как отдельный блок. Извлеките логику обработки ошибок и проверьте, действительно ли она вызывает ваш "retrier". И продолжайте извлекать единицы из описанной вами цепочки и тестировать их независимо!

После того, как эти тесты будут выполнены, вы можете решить написать интеграционный тест, а можете и не решить. Но это совершенно другая история, которая почти не перекликается с модульным тестированием.

person Sereja Bogolubov    schedule 07.06.2019