【发布时间】:2019-08-29 23:04:45
【问题描述】:
我有一个进行 HTTP 调用的服务,我正在尝试为它编写测试。我正在尝试测试的服务中的方法如下所示
// my.service.ts
setUserAgreement(accept: boolean): Observable<any> {
const data = { accept };
return this.http.post<any>(this.url, data, this.getHttpHeader('1'))
.pipe(
tap(x => this.logHttp(x)),
map(x => this.parseHttp(x)),
catchError(this.handleErrorInternal('setUserAgreement'))
);
}
我的测试文件是这样的
import { TestBed, async } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { myService } from './my.service';
describe('myService', () => {
let service;
let httpMock: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ HttpClientTestingModule ]
});
service = TestBed.get(myService);
httpMock = TestBed.get(HttpTestingController);
});
describe(`#setUserAgreement`, () => {
const mockResponse = 'Mock response';
afterEach(() => {
httpMock.verify();
});
it(`should not call handleErrorInternal when the call resolves successfully`, async(() => {
spyOn(service, 'handleErrorInternal');
service.setUserAgreement(true).subscribe(() => {
expect(service.handleErrorInternal).not.toHaveBeenCalled();
});
const req = httpMock.expectOne(service.url);
req.flush(mockResponse, { status: 200, statusText: 'OK' });
}));
});
});
但是测试失败并显示消息Error: Expected spy handleErrorInternal not to have been called.
有人可以帮忙吗?
【问题讨论】:
-
请检查您的
this.logHttp(x)和this.parseHttp(x)方法在测试运行时是否抛出任何异常?如果是,请确保这些方法不会抛出任何异常。 -
您应该在提供者数组中将您的服务指定给 TestBed。在导入数组之后,放一个逗号,然后是
providers: [myService]的新行 -
@user2216584 感谢您的回复。我为服务注释掉了这些行,但测试仍然失败。
-
@dmcgrandle 感谢您的回复。我将服务添加到提供程序(我很惊讶它在没有它的情况下构建)。但问题仍然存在。
-
嗯。将您的间谍更改为
and.callFake,为其提供一个功能,该功能将控制台记录正在发送的错误。这应该给你一个关于它来自哪里的线索......另外,在订阅中接收响应(你当前忽略返回的内容)并 console.log 它以确保它是你所期望的。
标签: angular unit-testing rxjs jasmine