如何解决如何编写单元测试我使用 mergeMap() 的 angular 服务?
我是 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 模式的正确方法是什么?
解决方法
我不确定您是否应该使用 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();
});
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。