2015-02-11 96 views
3

TL; DRKarma是否篡改运行测试时发送的ajax请求?Ajax:使用Karma时的空json响应


语境

我目前正在写单元测试的前端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)结果相同的终点。

其实我已经尽可能以重现Firefox使用使用卷曲完全相同的头不见了:

Firefox cURL

该返回正确的结果也是如此。

总结

  • 我很有信心的API运作良好
  • 我相信了APIReader片段效果很好(有没有什么给它,它给在开发中正确的结果)
  • 假设 Karma篡改ajax请求(擦拭身体或其他东西)的东西,但他们的website没有太多的文档可用,我找不到这样的东西。

关于发生了什么的一切线索?

回答

0

答案:CORS。

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

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

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

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

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

它现在按预期工作。