总体上来说,我真的很喜欢this resource用于AJAX,并且它可以测试AJAX参数中的success
或error
函数。
但是,当我选择不带$.ajax({ ... success: ... })
并选择不带.done()
时,我不确定如何测试。请帮助修改我的简单规格,谢谢!
代码
function itWorked() {}
function sendRequest(callbacks, configuration) {
$.ajax({}).done(function(response) {
itWorked()
});
}
规范
fdescribe("Ajax Tests", function() {
beforeEach(function() {
spyOn(window, "itWorked")
deferred = $.Deferred().done(function() { })
spyOn($, "ajax").and.callFake(deferred)
sendRequest()
})
it("should work", function() {
expect($.ajax).toHaveBeenCalled() // pass
expect(window.itWorked).toHaveBeenCalled(); // fail
});
});
答案 0 :(得分:0)
好吧,问题的示例可能与您在本地运行的示例不同,但是它应该在行spyOn($, "ajax").and.callFake(deferred)
中失败,因为callFake
需要一个函数,而deferred
不是。相反,deferred
应该是已解决的承诺,并使用.and.returnValue
而不是.and.callFake
。
这是一个可行的示例:
function itWorked() {
console.log("It worked!!");
}
function sendRequest(callbacks, configuration) {
$.ajax({}).done(function(response) {
itWorked();
});
}
describe("Ajax Tests", () => {
beforeEach(function() {
spyOn(window, "itWorked").and.callThrough();
deferred = $.Deferred().resolve(); // Call resolve
spyOn($, "ajax").and.returnValue(deferred); // Use return value
sendRequest();
});
it("should work", function() {
expect($.ajax).toHaveBeenCalled(); // pass
expect(window.itWorked).toHaveBeenCalled(); // pass
});
});
请注意,我已经添加了console.log("It worked!!");
并使用.and.callThrough();
只是在控制台中再次检查是否记录了“有效!” 。
在调用$.Deferred().resolve()时,您可以传递一个 mocked 响应,以在.done
或.then
回调中进行处理。类似于.resolve({ success: true })
。 Check an example here
希望有帮助