Lor*_*ard 5 javascript jquery jasmine
以下两种实现ajaxRequest(1)(2)的方法应该是等效的.
话说回来:
stub jQuery.ajax使用sinon和代码(2)我得到一个错误.我该如何解决? 请参阅代码(3)中的注释以获取更多详细信息.
(1)
ajaxRequest: function (message, callback) {
return $.ajax({
url: backendRouter.generate('feedback_send'),
type: 'POST',
dataType: 'json',
data: {
message: message
},
success: callback
});
}
Run Code Online (Sandbox Code Playgroud)
(2)
ajaxRequest: function (message, callback) {
return $.ajax({
url: backendRouter.generate('feedback_send'),
type: 'POST',
dataType: 'json',
data: {
message: message
}
}).success(callback);
}
Run Code Online (Sandbox Code Playgroud)
(3)
it("should execute the callback function on success", function () {
spyOn($, "ajax").andCallFake(function(options) {
options.success();
}); // If I use the code (2) I get the following error
// TypeError: Object #<Object> has no method 'success'
var callback = jasmine.createSpy();
ajaxRequest('some message', callback);
expect(callback).toHaveBeenCalled();
});
Run Code Online (Sandbox Code Playgroud)
(4)
it("makes a GET request for todo items", function () {
sinon.stub(jQuery, 'ajax');
backendController.ajaxRequest('some message', sinon.spy());
// Cannot call method 'success' of undefined
});
Run Code Online (Sandbox Code Playgroud)
这是一个演练:
如果您使用编号 2 中的代码,您将调用 jquery 上的 ajax 函数:
return $.ajax({
url: backendRouter.generate('feedback_send'),
type: 'POST',
dataType: 'json',
data: {
message: message
}
...
Run Code Online (Sandbox Code Playgroud)
使用这些参数调用此函数后,jQuery 返回一个恰好定义了成功函数的jqHR 。然后调用该成功函数:
...
}).success(callback);
Run Code Online (Sandbox Code Playgroud)
到目前为止一切都很顺利,直到您的 jasmine 测试监视 ajax 函数为止。您用来调用的相同选项$.ajax将传递给这个新间谍。
// this is the value of the options parameter
{
url: backendRouter.generate('feedback_send'),
type: 'POST',
dataType: 'json',
data: {
message: message
}
}
Run Code Online (Sandbox Code Playgroud)
当这个对象被传递时,你的假函数实际上尝试调用options.success,它不存在!因此出现了错误。