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

时间:2020-12-21 14:41:06

标签: angular typescript rxjs karma-jasmine karma-coverage

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

1 个答案:

答案 0 :(得分:0)

我不确定您是否应该使用 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();
    });
});