Ajax:使用Karma时空json响应

时间:2015-02-11 20:34:09

标签: jquery ajax json firefox karma-runner

TL; DR Karma是否会篡改运行测试时发送的ajax请求?


上下文

我目前正在为前端javascript应用程序编写单元测试。我使用Karma 0.12.31运行测试,我使用的唯一前端库与jQuery有关。

我有一个非常简单的类对象,负责从后端API获取和缓存结果:

function APIReader(baseUrl) {
    this.baseUrl = baseUrl;
    this.cache = {};
}
APIReader.prototype.updateCache = function(uuid) {
    var that = this;
    $.ajax({
        url : this.baseUrl+uuid,
        dataType : 'json',
        async : false,
        success : function (data) {
            that.cache[uuid] = data;
        },
        error : function(jqxhr, status, err) {
            that.cache[uuid] = undefined;
        }
    });
};
APIReader.prototype.get = function(uuid) {
    if (!(uuid in this.cache)) this.updateCache(uuid);
    return this.cache[uuid];
};

以下代码段就像开发服务器上的一个魅力一样:

var ar = new APIReader('http://server/api/endpoint/');
console.log(ar.get('18fc7dc1-7698-4b8e-900e-8262c1393067'));

问题

然而,当使用Karma测试时,请说:

it('should work', function() {
    var ar = new APIReader('http://server/api/endpoint/');
    expect(ar.get('some-uuid')).toEqual({
        ... some object ...
    });
});

我收到此错误:1) Expected null to be Object({ ... some object ... }).

我已经调查了一段时间,浏览器(Firefox 35)收到的ajax响应的主体似乎是空的。

Empty JSON in Firefox

我非常确定API(使用djangodjango-rest-framework编写)可以很好地工作,因为httpie可以为同一个端点提供正确的(非enpty)结果。< / p>

我实际上已经完成了使用cURL重现Firefox使用的完全相同的标题:

Firefox cURL

这也返回了正确的结果。

总结

  • 我非常有信心API运作良好
  • 我确信APIReader代码段运行良好(对此并不多,并且它在开发中提供了正确的结果)
  • 假设在Karma中有一些东西篡改了ajax请求(擦拭身体或其他东西)但是他们的website和我没有很多文档可用无法找到类似的东西。

有关发生了什么的任何线索?

1 个答案:

答案 0 :(得分:0)

回答:CORS。

似乎所有这一切都是因为API服务器不允许测试服务器执行跨源请求。

django app(API)使用django-cors-headers生成CORS标头。我没有意识到,基于端口的主机有区别:

CORS_ORIGIN_WHITELIST = (
    'localhost',
    'other-domain',
)

不允许在localhost:4000上运行的测试服务器发送CORS请求。我不得不添加以下内容:

CORS_ORIGIN_WHITELIST = (
    'localhost',
    'other-domain',
    'localhost:4000' # Karma test
)

现在按预期工作。