我想将Jasmine用于两件事,测试一个执行真正的ajax调用的函数,并从ajax调用中获取回调数据,以便在其他茉莉花测试中使用。
这是我到目前为止所做的:
Javascript功能:
function getAttributeInfo(selectedLayer){
// Get layer attributes
$.ajax({
type: 'get',
url: '/geoserver/oqplatform/ows?service=WFS&version=1.0.0&request=GetFeature&typeName='+ selectedLayer +'&outputFormat=json',
success: function(data) {
// pass the data into a global variable
foo = data;
// EDIT
return data;
}
});
}
测试:
it("an ajax test", function() {
var ajaxFunction = getAttributeInfo(SVIRLayerNames[0]);
// creating spied callback
var callback = jasmine.createSpy('callback');
spyOn($, 'ajax').and.callFake(function (req) {
var d = $.Deferred();
return d.promise();
});
// EDIT
//ajaxFunction.fetch(callback);
ajaxFunction(callback);
// everything after this does not seem to execute
var fakeData = callback.calls.mostRecent().args[0];
});
如果我在5秒后控制台记录foo变量,我可以看到ajax请求已经发出并且数据在foo变量中可用
答案 0 :(得分:1)
经过几天的研究,我最大的收获是Jasmine是一个很棒的工具,但文档很糟糕。我发现很难简单地理解间谍是什么以及什么时候应该使用它。
我的解决方案是根本不使用间谍。
beforeAll(function(done) {
var mySyncFunction = function () {
var layerName = 'foobar';
var layerRequest = getAttributeInfo(layerName);
layerRequest.success(function(layerResponse) {
// Pass data from the response into a global variable to be tests
// I can also check for things like the API version number.
});
layerRequest.done(function() {
// Alert Jasmine that the AJAX call is done
done();
});
};
mySyncFunction();
}
在getAttributeInfo函数中,我在return
之前添加了$.ajax
<强>更新强>
...
beforeAll(function(done) {
$.ajax({
url: '/my/data',
data: {},
success: function (response) {
foo = response
done();
},
dataType: 'html'
});
});
////////////////
// Some tests //
////////////////
it("meets some requirement", function() {
for (var i = 0; i < foo.length; i++) {
var name = foo[i].fields.name;
expect(name).toBeDefined();
}
});