Angular 2+ Unit测试调用调用httpclient get的服务的服务

时间:2017-12-21 11:37:02

标签: javascript angular unit-testing typescript

我在网上找到了很多关于如何测试发出API请求的服务的例子,但对于以下服务:

  • 调用另一个发出HTTP请求的服务并传递它 回到原来的服务
  • 根据
  • 发出http请求

我正在努力让它发挥作用。这是我的代码示例:

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');

1 个答案:

答案 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();
});