{ var -6ren">
gpt4 book ai didi

javascript - 为什么 Jasmine 在监视 $.ajax 时不重置 spy ?

转载 作者:行者123 更新时间:2023-11-30 17:30:36 25 4
gpt4 key购买 nike

我正试图在 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();
});
});
});

firstTestsecond test 如果我单独运行它们,它们会起作用。但是,如果我按上面所示运行这两个测试,我会收到以下错误消息:ajax 已经被监视

所以我的问题是:

  • Jasmine 不应该在每次测试后自动重置 spy 吗?为什么这对我不起作用?
  • 是否有另一种使用 spyOn 的方式让 Jasmine 重置 spy ?
  • 如何手动重置 spy ?

更新:我继续试验并自己找到了可能的解决方案。如果我在 it 规范中设置 spy ,两个测试都运行良好。下面是 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 在第一个版本中不重置 spy ,而在第二个版本中重置 spy ?

最佳答案

对于跨所有测试使用的东西,但您需要为每个测试重置它使用'beforeEach':http://jasmine.github.io/2.0/introduction.html#section-Setup_and_Teardown

Jasmine 不会神奇地知道你想要为每个“it” block 重新评估 describe body 的哪一行。

关于javascript - 为什么 Jasmine 在监视 $.ajax 时不重置 spy ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23150082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com