angular - 如何使用返回 void 的订阅测试函数
问题描述
我有一个ModelService
带有edit
函数的 TypeScript:
edit(model: Model): Observable<Model> {
const body = JSON.stringify(model);
return this.http.put(`/models/edit/${model.id}`, body));
}
我有一个带有订阅服务并在收到响应时导航EditComponent
的函数的 TypeScript:edit
edit(model: Model): void {
this.service
.edit(model)
.subscribe(() => this.router.navigate([`/models/details/${model.id}`]);
}
测试此组件edit
功能的最佳方法是什么?
我有一个 Jasmine 测试可以做到这一点:
// Setup
TestBed.configureTestingModule({
declarations: [EditComponent],
providers: [
{
provide: ModelService,
useValue: jasmine.createSpyObj('ModelService', ['edit'])
}
]
});
const fixture = TestBed.createComponent(EditComponent);
const component = fixture.componentInstance;
const modelService = fixture.debugElement.injector.get(ModelService);
fixture.detectChanges();
// Test
it('should call edit', () => {
fakeAsync(() => {
component.edit(model);
expect(modelService.edit).toHaveBeenCalled();
});
});
但是通过这个测试,我总是SPEC HAS NO EXPECTATIONS
在它运行时得到。我的理解fakeAsync
是它同步运行,所以我认为这会起作用。
我也尝试过使用、 和的多种变体async
,但在调用组件函数时,它们要么给出相同的消息,要么失败。tick()
done()
Cannot read property 'subscribe' of undefined
edit
在其他测试中,我已经能够使用return fixture.whenStable().then()
并且工作正常(如此处所述),但我不认为它在这里工作,因为组件函数正在返回而void
不是 Promise。
测试此组件功能的更好方法是什么?
解决方案
为了SPEC HAS NO EXPECTATIONS
这似乎不是正确的使用方式fakeAsync
,这就是为什么它说没有期望。它应该是:
it('should call edit', fakeAsync(() => {
component.edit(model);
expect(modelService.edit).toHaveBeenCalled();
});
无论如何,modelService.edit()
实际上是一个可以预期同步的调用,因为它是在内部调用的component.edit()
。
所以你可以像这样简单地测试它:
it('should call edit', () => {
component.edit(model);
expect(modelService.edit).toHaveBeenCalled();
});
为了Cannot read property 'subscribe' of undefined
因为您创建间谍对象而没有任何回报。因此,modalService.edit()
返回undefined
并且无法读取属性“订阅”。在这种情况下,我通常通过创建新的 Observable 或使用of()来存根其结果,并返回该组件可能需要与之交互的值。
jasmine.createSpyObj('ModelService', { edit: of() })
推荐阅读
- regex - 批处理窗口中的正则表达式
- javascript - Facebook SDK FB.GetLoginStatus 加载被 X-Frame-Options 拒绝(仅限 Firefox)
- cakephp - 如何在 cakephp3.6 中返回带有原始 html 数据的电子邮件模板?
- python - 在 colab 中使用 keras_to_tpu_model 时,TPU 运行速度与 CPU 一样慢
- c# - 如何正确使用旧的 asp 站点 url 重定向到 MVC 路由?
- image - 电脑上的顶部页眉图像以及手机和平板电脑上的中心
- c++ - 用鼠标单击 OpenGL 拖动 3d 对象
- excel - .Formula 运行时错误 1004 在某些机器上而不是其他机器上
- javascript - 注入 Javascript 函数在 Android React Native WebView 中不起作用,但在 iOS React Native 中工作正常
- python - 提取tar文件中文件夹的内容