1

我试图$.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();
        });
    });
});

firstTestsecond 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 在第一个版本中没有重置间谍,而在第二个版本中却这样做了?

4

1 回答 1

2

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

Jasmine 并不神奇地知道您要为每个“it”块重新评估您描述主体的哪些行。

于 2014-04-19T03:17:17.310 回答