Jasmine with Karma:Ajax 不工作

Jasmine with Karma: Ajax not working

问题

我正在使用 Jasmine and Karma(作为测试运行器)运行 Javascript 测试。问题是 Ajax 请求无法正常工作。

如果我使用 Karma 运行以下 Jasmine 测试:

describe("Tests Ajax", function(done){
    it("does not work", function(){
        var options = {
            "url": "http://www.google.com",
            "method": "GET",
            "complete": function(data){
                console.log("Done!");
                done();
            }
        };

        $.ajax(options);
    });
});

我收到以下 Karma 错误:

        PhantomJS 1.9.8 (Windows 8) Tests Ajax does not work FAILED
            Error: Timeout - Async callback was not invoked within timeout specified
            by jasmine.DEFAULT_TIMEOUT_INTERVAL.

这意味着测试花费了很长时间。我曾尝试在 beforeEach 中将 jasmine.DEFAULT_TIMEOUT_INTERVAL 设置为更长的时间,但这并不能改变结果。

如果我随后在我的浏览器中运行上面的 Ajax 代码,它会工作并输出“完成!”几乎立即。

以上结果使我得出结论,出于某种原因,Ajax 请求在使用 Karma 运行 Jasmine 测试时不起作用。

附加信息

操作系统: Windows 8
Karma 测试浏览器:PhantomJS(我也用 IE、Chrome、ChromeCanary 和 Firefox 测试过,结果是一样的)
业力版本:0.12.31
业力茉莉版本:0.3.2

Karma Config File
Github Repo

我选择不使用 Jasmine Ajax,因为我正在测试的代码涉及根据许多其他条件正确组合各种 Ajax options,然后解释结果。因此需要完成一个真正的 Ajax 请求(到本地文件)。

为了解决这个问题,我决定 运行 使用 grunt-contrib-jasmine 进行测试,并让服务器 运行 在后台为我的内容提供服务。

服务器我用了grunt-http-server。设置时我 运行 遇到了 2 个问题。首先是默认情况下 grunt-http-server 不允许跨源请求。要允许它们,您必须使用以下 headers:

向 g运行t 任务设置添加 headers 选项
{
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept'
}

我遇到的第二个问题是 grunt-http-server returns 数据在 body 字段中没有,但在 responseTextresponseJSON 字段中。