为什么这个角度cli Jasmine测试通过?

时间:2017-04-12 20:25:45

标签: angular jasmine karma-runner angular-cli

我在为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调用,这实际上是同步的。令我难过的是,当每个测试都有单独注入的服务和模拟后端时,另一个测试的存在会影响它上面的测试。每个测试不应该孤立运行吗?

感谢您的任何见解。

0 个答案:

没有答案