【问题标题】:Jasmine with Karma: Ajax not workingJasmine 与 Karma:Ajax 不工作
【发布时间】:2015-03-07 08:01:45
【问题描述】:

问题

我正在使用 JasmineKarma(作为测试运行者)运行 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,结果是一样的)Karma 版本:0.12.31
Karma Jasmine 版本:0.3.2

Karma Config File
Github Repo

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

【问题讨论】:

    标签: javascript ajax jasmine karma-runner karma-jasmine


    【解决方案1】:

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

    我使用grunt-http-server 作为服务器。我在设置时遇到了 2 个问题。第一个是默认情况下grunt-http-server 不允许跨域请求。要允许它们,您必须在 grunt 任务设置中添加 headers 选项,并使用以下标题:

    {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept'
    }
    

    我遇到的第二个问题是grunt-http-serverbody 字段中返回数据no,但在responseTextresponseJSON 字段中返回数据。

    【讨论】:

    • responseText 对我来说听起来像是正确的字段。我有一个类似的问题,这是由于 CORS 不接受请求 - 你的 onError 方法被调用了吗?这应该告诉你错误发生在哪里。
    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 2017-09-18
    • 2014-06-15
    相关资源
    最近更新 更多