我无法从单个测试规范中窥探多个ajax请求。我想使用JASMINE测试下面的myFirstFunction()
和mySecondFunction()
。
function myFirstFunction() {
$.postJSON('test1.htm', {operation:operation}, function (data) {
if (data != null && data.errorMsg != null && data.errorMsg.length > 0) {
$.populateErrorMessage(data);
} else {
operationAccess = data;
var tempAccessFlag = operationAccess[0].accessFlag;
if (tempAccessFlag) {
mySecondFunction();
}
}
});
}
function mySecondFunction(operation, operationAccess, reason) {
$.postJSON('test2.htm', {windowStart:0, windowSize:4}, function (data) {
if (data != null && data.errorMsg != null && data.errorMsg.length > 0) {
$.populateErrorMessage(data);
} else {
if (null != data && data.accessFlag == "SUCCESS") {
//do something
} else {
//do something
}
}
});
}
我写了以下测试规范&能够窥探第一个postJSON,如下所示 -
it("Test myFirstFunction & mySecondFunction", function () {
var operation = "customerPreviousOrder";
var myFirstFunctionData = [{"accessFlag":true}]
spyOn($, "ajax").andCallFake(function(params) {
params.success(myFirstFunctionData);
});
myFirstFunction();
expect(<Something>).toEqual(<Something>);
});
我想从上面的测试规范中测试mySecondFunction()
。因为myFirstFunction()
会调用mySecondFunction()
。那我怎么能窥探第二个postJSON?
答案 0 :(得分:2)
来自Pivotal的人开发并维护Jasmine-Ajax,这为Jasmine添加了AJAX支持,因此您可以测试请求和模拟响应。模拟安装在测试中或beforeEach
中
jasmine.Ajax.useMock();
测试中的所有请求都已收集并在全局变量ajaxRequests
中可用。任何请求都不会返回任何响应。要模拟响应,您必须在测试中调用.response([some data])
。
所以它会像:
it("Test myFirstFunction & mySecondFunction", function () {
var myFirstFunctionData = {responseText: '[{"accessFlag":true}]'};
jasmine.Ajax.useMock();
myFirstFunction();
ajaxRequests[0].response(myFirstFunctionData); // index depends on the order of the AJAX calls
expect(<Something>).toEqual(<Something>);
});
注意:有获取最新AJAX请求mostRecentAjaxRequest();
的全局方法。当您需要直接访问ajaxRequests
的元素时,请添加:
afterEach(function(){
clearAjaxRequests();
});
答案 1 :(得分:1)
你应该使用sinonJS,其中fake server嘲笑ajax的东西,所以你不必关心它。
var server = sinon.fakeServer.create();
server.respondWith('test1.htm', '[{"accessFlag":true}]');
server.respondWith('test2.htm', 'second answer');
server.autoRespond = true;
myFirstFunction();
答案 2 :(得分:0)
您可以尝试以下问题的虚拟解决方案。
来源功能:
function myFunction(){
$.ajax({ //First Ajax Call
url: <URL1>,
type: 'POST',
dataType: 'json',
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
async: false,
success: function (data) {
… some success statement
} else {
var enableCardReaderCall = $.ajax({ //Nested Ajax Call
type: 'POST',
url: <URL2>,
dataType: 'json',
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
success: function (result) {
// … some success statement
}
}
});
}); }
测试套件:
describe("Test Suit", function(){
beforeEach(function () {
var fakeData = "hi";
spyOn($, "ajax").andCallFake(function(params) { //First Spy On
params.success(function(fakeData){
spyOn($, "ajax").andCallFake(function(params) { //Nested Spy On
params.success("there is data")
})
});
});
});
it("Test Function", function() {
$.myFunction();
});
});
答案 3 :(得分:0)
ajax函数的参数有url值。
describe("Test Suit", function() {
beforeEach(function() {
spyOn($, 'ajax').and.callFake(function(options) {
if (options.url === 'test1.htm') {
options.success([{"accessFlag":true}]);
} else {
options.success('second answer');
}
});
});
it("Test myFirstFunction & mySecondFunction", function () {
myFirstFunction();
expect(<Something>).toEqual(<Something>);
}
});