我有一个实时搜索的场景,我需要在创建一个新的挂起ajax请求之前中止该挂起的ajax请求。虽然我已经编写了下面的代码,但它工作正常。
App.MyNamespace.xhr = null;
App.MyNamespace.makeAjaxRequest = function() {
if (App.MyNamespace.xhr) {
App.MyNamespace.xhr.abort();
App.MyNamespace.xhr = null;
}
App.MyNamespace.xhr = $.ajax({
type: "GET",
url: "test.html",
data: "query",
});
};
我正在尝试编写一个Jasmine测试,我需要测试我的ajax请求调用中止的场景,并将ajax请求分配回null。我的测试用例如下
describe('#makeAjaxRequest', function() {
describe('aborts previous ajax request', function() {
beforeEach(function() {
App.MyNamespace.xhr = jasmine.createSpyObj('App.MyNamespace.xhr', ['abort']);
App.MyNamespace.makeAjaxRequest();
});
it('calls abort on ajax request', function() {
expect(App.MyNamespace.xhr.abort).toHaveBeenCalled();
});
it('assigns ajax request to null', function() {
expect(App.MyNamespace.xhr).toBeNull();
});
});
});
现在,在上面的测试用例中,第二个语句就是将#jax请求分配给null'通过,但第一个声明,即'调用ajax请求中止'失败并出现以下错误
失败/错误:TypeError:' null'不是一个对象(评估' App.MyNamespace.xhr.abort')
我的假设是,当我们调用myAjaxRequest函数时,jasmine只是检查我们将其赋值为null的最后一个语句。虽然,它的第一个声明,即'在ajax请求中调用abort'如果我没有在实际函数中将App.MyNamespace.xhr请求分配回null,则传递。
我们如何测试这种情况,我可以测试它的两个语句,即它应该在ajax请求上调用abort以及将ajax请求分配回null。
答案 0 :(得分:0)
解决方法是在调用App.MyNamespace.makeAjaxRequest()函数之前将App.MyNamespace.xhr分配给变量。
describe('#makeAjaxRequest', function() {
describe('aborts previous ajax request', function() {
var xhr;
beforeEach(function() {
App.MyNamespace.xhr = jasmine.createSpyObj('App.MyNamespace.xhr', ['abort']);
xhr = App.ModalSearch.xhr;
App.MyNamespace.makeAjaxRequest();
});
it('calls abort on ajax request', function() {
expect(xhr.abort).toHaveBeenCalled();
});
it('assigns ajax request to null', function() {
expect(App.MyNamespace.xhr).toBeNull();
});
});
});