如何编写使用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 服务)组合成一个数组