2

我必须为此效果编写单元测试,即在出错时每 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);
  });
4

1 回答 1

1

首先,它不是单元测试。它是集成测试:它测试一系列不同的“单元”(必须在单元测试的帮助下进行测试)。

其次,您的测试用例听起来很奇怪!你怎么能保证在 3 次重试后结果会成功?

最后但并非最不重要的一点:提取您的重试逻辑并将其作为一个单独的单元进行测试。提取错误处理逻辑并测试它确实调用了您的“重试器”。并不断从您描述的链中提取单元并独立测试它们!

一旦有了这些测试,您可能会或可能不会决定编写集成测试。但这是一个完全不同的故事,几乎没有与单元测试重叠。

于 2019-06-07T15:27:02.737 回答