5

在 Jasmine 2.2文档中,我无法理解演示 Spies 基本用法的最后一个规范。

beforeEach()我们设置的部分bar = null,然后我们监视foo.setBar,然后我们调用foo.setBar了两次。我不明白为什么bar === null在最后一个规范中。不应该是bar === 456在间谍被拆除之前的规范吗?

这是示例:

describe("About a Spy", function(){
  var foo, bar = null;

  beforeEach(function() {
    foo = {
      setBar: function(value) {
        bar = value;
      }
    };

    spyOn(foo, "setBar"); // we spy

    foo.setBar(123); // shouldn't bar === 123 here?
    foo.setBar(456, 'another param'); // and bar === 456 here?
  });



  it("stops all execution on a function", function() {
    // What, why, how?
    expect(bar).toBeNull();

    //I expected this to be the case, but it's not.
    //expect(bar).toBe(456);
  });
});

我一定是误解了 beforeEach 是如何建立和拆除变量范围的,或者可能有一个步骤describe可以重置部分中的变量?或者他们从来没有真正接触过,因为我们只使用了 spy 功能而不是真正的功能?

如果您能解释一下bar这个规范套装中的变量到底发生了什么,那将非常有帮助,这样我就可以理解为什么它的值在上一个规范中仍然为空。

谢谢!

4

1 回答 1

5

如果您仔细观察,您可能会意识到 spyOn 正在用一个拦截函数调用并跟踪有关它们的许多潜在有用信息的间谍来替换原始函数。我们在上面遇到的问题是,一旦我们替换了原来的函数,我们就失去了它的能力。我们可以使用 andCallThrough 来解决这个问题。如果在调用 spyOn 后链接 andCallThrough(),则间谍会将对其的任何调用传递给原始函数

http://www.joezimjs.com/javascript/javascript-unit-testing-with-jasmine-part-2/

于 2015-09-02T13:51:12.147 回答