javascript - 如何在茉莉花中测试完成的ajax部分
问题描述
我真的很喜欢这个 AJAX 资源,它适用于测试 AJAX 参数中的一个success
或error
函数。
但是,当我选择没有 a$.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
});
});
解决方案
好吧,问题中的示例可能与您在本地运行的示例不同,但它应该在行中失败,spyOn($, "ajax").and.callFake(deferred)
因为callFake
期望一个函数而deferred
不是。相反,deferred
应该是一个已解决的 Promise并使用.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()时,您可以传递一个模拟响应以在您的或回调中处理。类似的东西。在此处查看示例.done
.then
.resolve({ success: true })
希望能帮助到你
推荐阅读
- android - 在 android 中使用 Room 时出错:错误 2067 (SQLITE_CONSTRAINT_UNIQUE)
- reactjs - React 如何更改具有关键属性的组件?
- php - 当我尝试使用 symfony 创建实体时出现 Aborted 错误消息
- angular - 角度材质 flex - 在 fxLayout 内滚动
- sql - 动态 SQL 中的 IN 运算符,其中值来自参数
- python-3.x - 当您将数字(524)作为第二个输入时,如何转换..for 例如:abc(输入)到 fdg(输出)?
- php - 使用 maatwebsite 和 laravel 查询导出 excel
- scala - 使用 spark 找出文件中行的位置
- javascript - 单击一个按钮暂停其他功能间隔
- python - 文件夹中的随机重复图像 Python tkinter