以下两种实现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
});
}
(2)
ajaxRequest: function (message, callback) {
return $.ajax({
url: backendRouter.generate('feedback_send'),
type: 'POST',
dataType: 'json',
data: {
message: message
}
}).success(callback);
}
(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();
});
(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
});
答案 0 :(得分:4)
这是一个演练:
如果使用数字2中的代码,则在jquery上调用ajax函数:
return $.ajax({
url: backendRouter.generate('feedback_send'),
type: 'POST',
dataType: 'json',
data: {
message: message
}
...
在使用这些参数调用此函数后,jQuery返回恰好定义了成功函数的jqHR。然后调用该成功函数:
...
}).success(callback);
到目前为止一切都很好,直到你的茉莉花测试间谍ajax功能。您用于调用$.ajax
的相同选项将传递给此新间谍。
// this is the value of the options parameter
{
url: backendRouter.generate('feedback_send'),
type: 'POST',
dataType: 'json',
data: {
message: message
}
}
当传递此对象时,您的假函数实际上会尝试调用options.success
,而该{{1}}不存在!因此错误。
答案 1 :(得分:1)
有一个jquery插件使用sinonjs
和qunit
,并提供了一种更简单的方法来编写ajax测试并获得预期的结果。
查看 jqueryspy