6

下面两种实现ajaxRequest(1)(2)的方式应该是等价的。
话说回来:

  1. 为什么验证回调的单元测试(3)执行,(1)成功,(2)失败?
  2. 我应该如何重写测试 (3) 以监视 (2) 中的成功回调?
  3. 如果我尝试 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
});
4

2 回答 2

4

这是一个演练:

如果您使用编号 2 中的代码,您将在 jquery 上调用 ajax 函数:

return $.ajax({
  url: backendRouter.generate('feedback_send'),
  type: 'POST',
  dataType: 'json',
  data: {
    message: message
  }
...

在使用这些参数调用此函数后,jQuery 返回一个jqHR ,该 jqHR恰好定义了一个成功函数。然后调用该成功函数:

...
}).success(callback);

到目前为止一切都很好,直到您的 jasmine 测试监视 ajax 函数。您用来调用的相同选项$.ajax将传递给这个新间谍。

// this is the value of the options parameter
{
    url: backendRouter.generate('feedback_send'),
    type: 'POST',
    dataType: 'json',
    data: {
        message: message
    }
}

传递此对象时,您的假函数实际上会尝试调用options.success不存在的 !因此错误。

于 2012-08-23T09:19:54.720 回答
1

有一个 jquery 插件,它使用sinonjsqunit提供了一种更简单的方法来编写 ajax 测试并获得预期的结果。

看看jqueryspy

于 2015-03-28T08:10:44.183 回答