如何正确使用Jasmine和inon单元测试jQuery的.ajax()promises?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

我有一个相当简单的函数,它返回一个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
    });
}

大多数情况下,这个新的promise界面工作,在使用jQuery的.ajax()方法时,消除了回调。然而,如何用Jasmine和/或Sinon来正确地测试这些promise?

提问于
用户回答回答于

实际上并不那么复杂。根据你的情况返回promise并解决问题就足够了。

例如:为了成功,

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

为了失败:

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

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

spyOn($, 'ajax').and.callFake(function (req) {});

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

用户回答回答于

类似的东西/带有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());

扫码关注云+社区

领取腾讯云代金券