如何使用Jasmine和/或Sinon正确地测试jQuery的.ajax()承诺?

J. *_*rsh 55 jquery unit-testing jasmine sinon

我有一个相当简单的函数,它返回一个jQuery .ajax()的承诺:

CLAW.controls.validateLocation = function(val, $inputEl) {
    return $.ajax({
        url: locationServiceUrl + 'ValidateLocation/',
        data: {
            'locationName': val
        },
        beforeSend: function() {
            $inputEl.addClass('busy');
        }
    }).done(function(result) {
        // some success clauses
    }).fail(function(result) {
        // some failure clauses
    }).always(function() {
        // some always clauses
    });
}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,这个新的promises接口就像一个梦想,并在使用jQuery的.ajax()时很好地消除了回调金字塔.但是,我不能为我的生活弄清楚如何使用Jasmine和/或Sinon正确测试这些承诺:

  1. 所有Sinon的文档都假设您正在使用旧式回调; 我没有看到如何将它与promises/deferred一起使用的单个示例

  2. 当尝试使用茉莉花或兴农窥探窥探$阿贾克斯,间谍有效覆盖的承诺,所以其done,failalways条款不再对AJAX功能的存在,因此从来没有承诺解决和扔一个错误,而不是

我真的很喜欢一个或两个如何用上述测试库测试这些新的jQuery .ajax()promises的例子.我已经相当强烈地搜索了'网,并没有真正挖掘任何东西这样做.我找到的一个资源是使用Jasmine.ajax提到的,但我想尽可能避免这种情况,因为Sinon提供了大部分开箱即用的相同功能.

ggo*_*zad 106

实际上并不复杂.只需返回一个承诺并根据您的情况解决它.

例如:

spyOn($, 'ajax').andCallFake(function (req) {
    var d = $.Deferred();
    d.resolve(data_you_expect);
    return d.promise();
});
Run Code Online (Sandbox Code Playgroud)

为了成功,或

spyOn($, 'ajax').andCallFake(function (req) {
    var d = $.Deferred();
    d.reject(fail_result);
    return d.promise();
});
Run Code Online (Sandbox Code Playgroud)

因为失败.

对于Jasmine 2.0,语法略有改变:

spyOn($, 'ajax').and.callFake(function (req) {});
Run Code Online (Sandbox Code Playgroud)

Jasmine 2.0中不存在.andCallFake()方法

  • 对诗乃方式的任何想法? (8认同)

小智 16

沿着这些线/与sinon和jQuery延迟的东西

ajaxStub = sinon.stub($, "ajax");

function okResponse() {
  var d = $.Deferred();
  d.resolve( { username: "testuser", userid: "userid", success: true } );
  return d.promise();
};

function errorResponse() {
 var d = $.Deferred();
 d.reject({},{},"could not complete");
 return d.promise();
};

ajaxStub.returns(okResponse());
ajaxStub.returns(errorResponse());
Run Code Online (Sandbox Code Playgroud)