为什么Jasmine在监视$ .ajax时没有重置间谍?

时间:2014-04-18 08:10:46

标签: javascript ajax typescript jasmine spy

我试图在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

所以我的问题是:

  • 每次测试后,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不会在第一个版本中重置间谍,而在第二个版本中呢?

1 个答案:

答案 0 :(得分:2)

对于在所有测试中使用的内容,但是您需要在每次测试时使用它重置' beforeEach' :http://jasmine.github.io/2.0/introduction.html#section-Setup_and_Teardown

Jasmine并不会神奇地知道你想要为每个人描述哪一行你需要重新评估的内容'它'块。