我试图$.ajax
在 Jasmine 2.0 测试中进行监视。这是一个显示我的场景的简化示例(TypeScript):
describe("first test", () => {
var deferred = jQuery.Deferred();
spyOn($, "ajax").and.callFake((uri: string, settings: JQueryAjaxSettings) => {
return deferred.resolve("ThisIsADummyResult");
});
it("should return dummy result", done => {
$.ajax("http://somedummyserver.net").then(result => {
expect(result).toBe("ThisIsADummyResult");
done();
});
});
});
describe("second test", () => {
var deferred = jQuery.Deferred();
spyOn($, "ajax").and.callFake((uri: string, settings: JQueryAjaxSettings) => {
return deferred.resolve("ThisIsAnotherResult");
});
it("should return another result", done => {
$.ajax("http://somedummyserver.net").then(result => {
expect(result).toBe("ThisIsAnotherResult");
done();
});
});
});
firstTest
second test
如果我单独运行它们,也可以工作。但是,如果我如上所示运行这两个测试,我会收到以下错误消息:ajax has already been spied upon
.
所以我的问题是:
- Jasmine不应该在每次测试后自动重置间谍吗?为什么这在我的情况下不起作用?
- 有没有另一种使用方式
spyOn
可以让 Jasmine 重置间谍? - 如何手动重置间谍?
更新:我继续试验并自己找到了一个可能的解决方案。it
如果我在规范中设置了间谍,那么两个测试都运行良好。这是first test
显示我的意思的代码:
describe("first test", () => {
it("should return dummy result", done => {
var deferred = jQuery.Deferred();
spyOn($, "ajax").and.callFake((uri: string, settings: JQueryAjaxSettings) => {
return deferred.resolve("ThisIsADummyResult");
});
$.ajax("http://somedummyserver.net").then(result => {
expect(result).toBe("ThisIsADummyResult");
done();
});
});
});
尽管如此,为什么第一个版本不起作用会很有趣。为什么 Jasmine 在第一个版本中没有重置间谍,而在第二个版本中却这样做了?