如何编写使用mergeMap()的角度服务的单元测试?

Posted

技术标签:

【中文标题】如何编写使用mergeMap()的角度服务的单元测试?【英文标题】:How to write unit test my angular service which uses mergeMap()? 【发布时间】:2021-03-31 07:58:15 【问题描述】:

我是 karma/jasmine 框架的新手。

我正在尝试添加一个测试用例来覆盖我的服务方法(下)

public getAllChassis(): Observable<Chassis[]> 
      return this.http.get('chassis').pipe(
            mergeMap((result: Chassis[]) => 
               for (const chassis of result) 
                  chassis.healthStatus = 45;
                  chassis.complianceStatus = 81;
               
               return of(result);
            ));
   

这不包括回调/内部管道语句。 测试这些 mergeMap 模式的正确方法是什么?

【问题讨论】:

在您的帖子中包含您目前拥有的单元测试代码。 您必须模拟Chassis 结果并使用该模拟监视http.get().pipe()。然后你可以通过简单地订阅间谍来验证返回。 你能把你目前拥有的测试代码包括进来吗?另外,你为什么使用mergeMap 而不仅仅是map 然后删除of 【参考方案1】:

我不确定您是否应该使用mergeMap。你应该检查一下。

以下是我如何从发出 HTTP 请求并返回 observable 的服务中测试函数。

1 - 模拟 HTTP 客户端

这是我在 Angular 项目中如何使用TestBed 注入依赖项的示例。

let httpClient: HttpClient;
let service: YourService;
beforeEach(() => 
    TestBed.configureTestingModule(
        imports: [HttpClientTestingModule],
        ...
        ).compileComponents();
    httpClient = TestBed.get(HttpClient);
    service = TestBed.get(YourService);
);

2 - 窥探模拟函数

为确保 get 请求返回您想要的,您必须监视它并提供虚假结果。

describe("WHEN: getAllChassis", () => 
  beforeEach(() => 
    const RESPONSE_MOCK = of(
      new HttpResponse(
        body: 
          /* whatever your service returns */
        ,
      )
    );
    spyOn(httpClient, "get").and.returnValue(RESPONSE_MOCK);
  );

  // Here will go your test
);

3 - 检查你的函数结果

要测试您的功能,请检查它是否返回您所期望的(考虑到我们知道 http.get 将返回什么)。

请注意,我使用的是done,因为这是一个异步函数。在调用 done(或超时)之前,测试不会结束。

it("THEN: should return data", (done) => 
  getAllChassis()
    .pipe(take(1))
    .subscribe((data) => 
      expect(data).toEqual(
        /* what you expect in result */
      );
      done();
    );
);

【讨论】:

以上是关于如何编写使用mergeMap()的角度服务的单元测试?的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:readFile $(...).mergeMap不是firebase服务函数中的函数

如何在角度单元测试中使用 debugeElement 访问 nativeElement 属性

Rxjs:使用 scan 或 mergeMap 或任何 rxjs 在 X 秒后将 observables 数据流(grpc 服务)组合成一个数组

使用 jasmine 对控制器中基于资源的工厂进行角度 js 单元测试

如何订阅角度服务单元测试中的错误案例

如何在单元测试SpringBoot中解析JWT令牌