我有一个触发ajax请求的Jasmine 2.0.2测试,但是每次触发请求时,模拟ajax返回应该是一个特定的返回值。
var setUpDeleteEventInAjax = function(spyEvent, idToReturn){
var spy;
spy = jasmine.createSpy('ajax');
spyAjaxEvent = spyOnEvent(spyEvent, 'click');
spyOn($, 'ajax').and.callFake(function (param) {
return {
id: idToReturn, // here I am trying to return a defined value
status: true
};
});
spyAjaxEvent.reset(); // this should reset all ajax evetns
};
...
beforeEach(function(){...})
afterEach(function(){...})
...
it('Deleting all the addresses should reveal the form', function () {
setUpDeleteEventInAjax('#delete',52670);
$('#delete').click();
expect($('.address-item').length).toEqual(4);
setUpDeleteEventInAjax('#delete-2',52671);
$('#delete-2').click();
expect($('.address-item').length).toEqual(2);
setUpDeleteEventInAjax('#delete-3',52672);
$('#delete-3').click();
expect($('.address-item').length).toEqual(0);
});
...
点击删除按钮(delete,delete-2,delete-3)后,地址项的总长度减少了2,(当服务器返回一个数字时 - 这是模拟的关键)。
然而, Jasmine 提示“ajax 已经被监视”。有没有办法从 ajax 模拟返回新值来完成测试?
最佳答案
实际上我的处理方式是过度设计的。只是需要一个关闭。不需要我的自定义 setUpDeleteEventInAjax
函数
it('Deleting all the addresses should reveal the form', function () {
var responses = [52670, 52671, 52672];
var ajaxResponses = function () {
return {
status: true,
id: responses.shift()
}
};
spyOn($, 'ajax').and.callFake(ajaxResponses);
$('#delete').click();
expect($('.address-item').length).toEqual(4);
$('#delete-2').click();
expect($('.address-item').length).toEqual(2);
expect($('.address-book')).toHaveClass('single-address');
$('#delete-3').click();
expect($('.address-item').length).toEqual(0);
});
关于javascript - Jasmine,一次测试,多次ajax请求(错误: ajax has already been spied upon ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34303715/