这可能只是部分答案。
我不是测试专家,所以我不应该试图解释
为什么
你的代码失败了,但我相信下面的代码是正确的,并且做了正确的测试。
imo在get案例中,您的代码有两个问题:
-你在期待间谍之后脸红了-应该是相反的方向
-你不是在打电话
done()
从内
.subscribe()
不过,post case的代码似乎工作正常(除了测试描述似乎不正确之外,难道不是应该改为“不应该记录”吗?)
我漏掉了支票
Content-Type
头球因为某些原因失败了(没有时间进一步调查-会很好奇你是否解决了它),这不是你的问题的一部分。
describe('Logger Interceptor', () => {
let httpMock: HttpTestingController;
let httpClient: HttpClient;
let logService: LogService;
let spy: Function;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [
{
provide: HTTP_INTERCEPTORS,
useClass: LoggerInterceptor,
multi: true,
},
],
});
httpClient = TestBed.get(HttpClient);
httpMock = TestBed.get(HttpTestingController);
logService = TestBed.get(LogService);
spy = spyOn(logService, 'log');
});
afterEach(() => httpMock.verify());
it('must log the http get request', (done) => {
httpClient.get('http://jsonplaceholder.typicode.com/posts').subscribe((data: any[]) => {
expect(data.length).toBe(2);
done();
});
const req: TestRequest = httpMock.expectOne('http://jsonplaceholder.typicode.com/posts');
req.flush(posts);
expect(spy).toHaveBeenCalled();
});
it('should NOT log the http post request', () => {
httpClient.post('http://jsonplaceholder.typicode.com/posts', posts)
.subscribe();
const req: TestRequest = httpMock.expectOne('http://jsonplaceholder.typicode.com/posts');
expect(spy).not.toHaveBeenCalled();
req.flush(posts);
});
});
如果有人能解释的话,我很想知道为什么GET案例需要进行上述更改。