【问题标题】:How to write unit test for effect that after n times return a valid response?如何编写单元测试以获得在 n 次后返回有效响应的效果?
【发布时间】:2019-10-23 02:32:00
【问题描述】:

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

【问题讨论】:

  • 单元测试不适用于 apis 或任何其他系统。请使用正确的标签

标签: angular integration-testing rxjs6 jasmine-marbles rxjs-marbles


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多