为什么spyOn"停止函数“”的所有执行;Jasmine(要求澄清Jasmine 2.2间谍文件)

Why spyOn "stops all execution of a function" in Jasmine (asking for clarification on Jasmine 2.2 Documentation on Spies)

本文关键字:Jasmine 文件 执行 间谍 quot spyOn 函数 为什么      更新时间:2023-09-26

在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部分中的变量?还是他们从未真正接触过,因为我们只使用了间谍功能,而不是真正的功能?

如果你能解释一下这套规范中变量bar的具体情况,我会很有帮助,这样我就能理解为什么它的值在上一套规范中保持为空。

谢谢!

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

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