我试图在Jasmine 2.0测试中监视$.ajax
。这是一个显示我的场景的简化示例(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
。
所以我的问题是:
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不会在第一个版本中重置间谍,而在第二个版本中呢?
答案 0 :(得分:2)
对于在所有测试中使用的内容,但是您需要在每次测试时使用它重置' beforeEach' :http://jasmine.github.io/2.0/introduction.html#section-Setup_and_Teardown
Jasmine并不会神奇地知道你想要为每个人描述哪一行你需要重新评估的内容'它'块。