angular - 如何编写使用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 模式的正确方法是什么?
解决方案
我不确定您是否应该使用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();
});
});
推荐阅读
- macos - Vim 彻底坏了,不能用
- c# - Microsoft Access 的 OleDbConnection.State 问题
- python - 如何检查是否在 tkinter python 中编辑了文本小部件?
- mysql - mysql上END附近的事件计划错误标记
- java - 在 onComplete 方法中实现接口的问题
- python - 在 python 中与 linux 控制台交互
- java - Android 应用程序语言随处变化,但在菜单和选项卡布局标题中没有变化
- python - 如何删除数据库中带有条件的行?
- python - model.predict_generator() 中的死锁与 use_multiprocessing=True
- r - 为什么 car 包中的 vif() 结果与 lmridge R 中的结果不同?