我在为Angular 2服务编写测试时遇到了一个非常有趣的问题。我在angular-cli的> ng测试命令下运行测试,因此它们是由Karma运行的Jasmine测试。
这是我的测试:
it('should get path from the server once and save it to the service', inject([LookupService, XHRBackend], (_service, _mockBackend) => {
let responseOptions = new ResponseOptions({ body: JSON.stringify({ path: 'http://example.com/api/' }) });
var lastConnection;
_mockBackend.connections.subscribe(connection => {
lastConnection = connection;
connection.mockRespond(new Response(responseOptions));
});
_service.getPath()
.then((firstResponse) => {
_service.getPath()
.then((secondResponse) => {
expect(2).toBe(1);
});
});
}));
请注意,我将异步_service.getPath()调用两次;这里的想法是,在第一次调用时,它从服务器检索相关数据并将其存储在服务中,以便在第二次调用时不会发出服务器请求。但是,我注意到第二个lambda中的任何期望语句似乎都没有注册到测试运行器。也就是说,即使期望失败,测试本身也不会失败。
通过调试,我知道该块中的代码正在执行,而且我知道即使在我的真实测试中(这比预期2更复杂一点)我得到两个不相等的数字。
现在这里真的很奇怪:假阳性只出现在文件中的最终测试中。所以如果我在这个下面添加一个虚拟测试,就像这样:
it('should get path from the server once and save it to the service', inject([LookupService, XHRBackend], (_service, _mockBackend) => {
let responseOptions = new ResponseOptions({ body: JSON.stringify({ path: 'http://example.com/api/' }) });
var lastConnection;
_mockBackend.connections.subscribe(connection => {
lastConnection = connection;
connection.mockRespond(new Response(responseOptions));
});
_service.getPath()
.then((firstResponse) => {
_service.getPath()
.then((secondResponse) => {
expect(2).toBe(1);
});
});
}));
it('should really work without this', inject([LookupService, XHRBackend], (_service, _mockBackend) => {
}));
然后,之前传递的测试失败,应该如此。
我只能想象这是某种异步问题,但我相信我的承诺正确执行,我使用Angular 2的MockBackend来模拟HTTP调用,这实际上是同步的。令我难过的是,当每个测试都有单独注入的服务和模拟后端时,另一个测试的存在会影响它上面的测试。每个测试不应该孤立运行吗?
感谢您的任何见解。