Как написать модульный тест для эффекта, который через n раз вернет правильный ответ? - PullRequest
2 голосов
/ 07 июня 2019

Я должен написать модульный тест для этого эффекта, который вызывает службу каждые 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 Ответ

1 голос
/ 07 июня 2019

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

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

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

Когда эти тесты пройдут, вы можете или не захотите написать интеграционный тест. Но это совсем другая история, которая почти не совпадает с юнит-тестированием.

...