我有一个相当简单的函数,它返回一个jQuery .ajax() promise:
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
});
}
在大多数情况下,这个新的promises接口就像一个梦一样工作,并且在使用jQuery的.ajax()时消除回调金字塔是很棒的。然而,我无论如何也想不出如何使用Jasmine和/或Sinon来正确地测试这些承诺:
done
、fail
和always
子句在ajax函数中不再存在,所以承诺永远不会解决并抛出错误,而是使用我真的很喜欢用前面提到的测试库测试这些新的jQuery .ajax()承诺的一两个例子。我已经相当强烈地搜索了网络,但没有真正挖掘出任何关于这样做的东西。我找到的一个资源提到了使用Jasmine.ajax,但如果可能的话,我想避免这种情况,因为Sinon提供了大多数开箱即用的功能。
发布于 2012-11-01 03:07:29
实际上,这并不是那么复杂。返回一个承诺并根据您的情况解决它就足够了。
例如:
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) {});
.andCallFake()方法在Jasmine 2.0中不存在
发布于 2013-04-19 01:45:44
与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());
发布于 2013-04-26 20:14:50
这里有一个使用javascript的更简单的方法。
quoteSnapshots: function (symbol, streamId) {
var FakeDeferred = function () {
this.error = function (fn) {
if (symbol.toLowerCase() === 'bad-symbol') {
fn({Error: 'test'});
}
return this;
};
this.data = function (fn) {
if (symbol.toLowerCase() !== 'bad-symbol') {
fn({});
}
return this;
};
};
return new FakeDeferred();
}
每个回调中的if语句是我在测试中用来驱动成功或错误执行的语句。
https://stackoverflow.com/questions/13148356
复制相似问题