使用不同的andCallFake()方法重用Jasmine Spy

时间:2014-03-18 15:52:57

标签: coffeescript jasmine

我正在尝试在jasmine(版本1.3)中编写一些高级测试,我在$.getJSON()方法上设置间谍。这是在beforeEach块中设置的:

describe 'the Controller', ->
    beforeEach ->
    Fixtures.createTestData()
    jqXHR = Fixtures.jqXHR
    section = new section({el:appDom})

    response = Fixtures.createSectionsSearchResponse()
    spyOn($, 'getJSON').andCallFake( ->
        jqXHR.resolve(response)
    )

然后我像往常一样浏览搜索查询(效果很好)。

在我后来的一个测试中,我有第二个API被ping。我想更改正在发送的响应,但似乎无法正常工作。 This Blog似乎意味着我可以只使用不同的andCallFake()重用间谍,但它似乎不起作用。我得到了原始的响应对象,而不是我重写的方法

    $.getJSON.andCallFake( ->
        jqXHR.resolve({"count":4})
    )

关于如何重用或销毁原始间谍方法的任何想法?

2 个答案:

答案 0 :(得分:2)

您可以重置间谍。

来自Jasmine guide

it("can be reset", function() {
    foo.setBar(123);
    foo.setBar(456, "baz");

    expect(foo.setBar.calls.any()).toBe(true);

    foo.setBar.calls.reset();

    expect(foo.setBar.calls.any()).toBe(false);
});

答案 1 :(得分:2)

Jasmine 2.0 documentation描述了reset()方法,但Jasmine 1.3 documentation没有提到它。

对于Jasmine 1.3,我相信您正在寻找的是

foo.setBar.reset();

翻译成1.3语法的Jasmine 2.0文档的等效部分如下:

it("can be reset", function() {
  foo.setBar(123);
  foo.setBar(456, "baz");

  expect(foo.setBar).toHaveBeenCalled();

  foo.setBar.reset();

  expect(foo.setBar).not.toHaveBeenCalled();
});

Here's a fiddle as well.