首页 > 解决方案 > 如何编写使用mergeMap()的角度服务的单元测试?

问题描述

我是 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 模式的正确方法是什么?

标签: angulartypescriptrxjskarma-jasminekarma-coverage

解决方案


我不确定您是否应该使用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的是异步函数。在调用完成(或超时)之前,测试不会结束。

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

推荐阅读