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响应的主体似乎是空的。
我非常确定API(使用django和django-rest-framework编写)可以很好地工作,因为httpie可以为同一个端点提供正确的(非enpty)结果。< / p>
我实际上已经完成了使用cURL重现Firefox使用的完全相同的标题:
这也返回了正确的结果。
APIReader
代码段运行良好(对此并不多,并且它在开发中提供了正确的结果)有关发生了什么的任何线索?
答案 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
)
现在按预期工作。