嗨,我正在用 jasmine 编写单元测试用例。我正在与组件中的 Restful API 进行交互。我正在编写用于删除、添加用户等的单元案例。我有将调用 API 的服务,并且我编写了一些不会与 API 交互的模拟服务。我已经创建了 JSON 数据,所有 API 都会从这个 JSON 对象中获取数据。现在我已经为删除用户编写了单元测试。现在我应该调用与服务器交互的真实服务或我创建的将与本地 JOSN 数据交互的模拟服务?下面是我的示例模拟服务和单元测试。
下面是删除用户的单元测试。
it('should delete the user', async(() => {
spyOn(service, 'deleteUserEndpoint');
let button = fixture.debugElement.nativeElement.querySelector('#delete');
button.click();
fixture.whenStable().then(() => {
expect(service.deleteUserEndpoint('101')).toHaveBeenCalled();
})
}));
下面是我的模拟服务。
deleteUserEndpoint(userid: string) {
var deleteUserUserOnboard = { result: true };
return Observable.of(deleteUserUserOnboard);
}
有人可以确认我应该致电哪些服务吗?此外,当我运行上面的代码时,我遇到了以下错误。
Failed: <spyOn> : could not find an object to spy upon for deleteUserEndpoint()
有人可以帮助我使我的单元测试成功运行吗?任何帮助,将不胜感激。谢谢
首先,你应该从来不叫真正的REST API服务或任何与单元测试与外部世界的互动,这是一个集成测试的工作。这样做的原因是,当外部依赖成功但也失败时,您的测试必须能够评估代码是否运行顺利……这就是模拟有用的原因
要模拟您的服务,请使用fixture.debugElement.injector.get()
:
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [Component],
imports: [...]
}).overrideComponent(Component, {
set: {
providers: [Service]
OR
providers : [{
provide : Service, useClass : ServiceMock
}]
}
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(Component);
target.detectChanges();
});
it('should delete the user when service succeed', async(() => {
let service = fixture.debugElement.injector.get(Service)
spyOn(service, 'deleteUserEndpoint');
let button = fixture.debugElement.nativeElement.querySelector('#delete');
button.click();
fixture.whenStable().then(() => {
expect(service.deleteUserEndpoint).toHaveBeenCalledWith("101");
})
}));
it('should show error message when service fails, async(() => {
let service = fixture.debugElement.injector.get(Service)
spyOn(service, 'deleteUserEndpoint').and.throwError("Deletion Failed");
let button = fixture.debugElement.nativeElement.querySelector('#delete');
button.click();
fixture.whenStable().then(() => {
// test here that you have the appropriate error message displayed
})
}));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句