我在网上找到了很多关于如何测试发出API请求的服务的例子,但对于以下服务:
我正在努力让它发挥作用。这是我的代码示例:
beforeEach((done) => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule,
HttpClientTestingModule,
JwtModule.forRoot({
jwtOptionsProvider: {
provide: JWT_OPTIONS,
useFactory: jwtOptionsFactory,
deps: []
}
}),
],
providers: [
ConfigService,
AuthenticationService,
UserService,
JobService
]
});
let injector = getTestBed();
sut = injector.get(JobService);
httpMock = injector.get(HttpTestingController);
});
describe('Appointment Management', () =>{
it('should set an apointment', () => {
expect(sut).toBeDefined();
const dummyResponse = 'dsfsdf';
sut
.setAppointmentDate('temp', new Date(2017, 12, 31))
.subscribe(result => {
expect(result).toEqual(dummyResponse)
})
const req = httpMock.expectOne('http://localhost:32307/appointments');
expect(req.request.method).toBe('POST');
req.flush(dummyResponse);
});
})
为了更清楚地了解这里发生的事情,工作服务正在测试中。它具有configService和userService的依赖关系。
用户服务具有configService和身份验证服务的依赖关系。
路由器和jwt服务是身份验证服务和用户服务的依赖关系。
所有服务也依赖于httpclient。
我正在接受的实际应对:
错误:超时 - 在jasmine.DEFAULT_TIMEOUT_INTERVAL指定的超时时间内未调用异步回调。
它甚至不应该打一个真正的电话,所以我不确定为什么它会超时。我已经尝试删除依赖项所做的调用,并导致相同的错误,例如
const userRequest = httpMock.expectOne('http://localhost:32307/user');
userRequest.flush('temp');
答案 0 :(得分:1)
进行单元测试时,您需要测试正在测试的服务。您不测试其依赖项的作用。
这意味着,您只需要测试服务是否正在调用其他服务,并模拟返回。
由于jobService正在测试中,因此调用config&用户服务(根据我所理解的内容),你应该测试你的功能:
US = injector.get(UserService);
CS = injector.get(ConfigService);
it('Testing a function called myFunc in your service ...', () => {
spyOn(US, 'myUserServiceFunctionCalled')
.and.returnValue(Observable.of('The mocked answer returned by this function'))
spyOn(CS, 'myConfigServiceFunctionCalled')
.and.returnValue(Observable.of('The mocked answer returned by this function'))
sut.myFunc(); // .subscribe if it's an Observable, and put your expects in it
expect(US.myUserServiceFunctionCalled).toHaveBeenCalled();
expect(CS.myConfigServiceFunctionCalled).toHaveBeenCalled();
});