茉莉Spies.and.stub方法

Jasmine Spies.and.stub method

我一直在通读 Jasmine 文档,并且一直在努力理解 Spies .and.stub 方法的实际作用。英语不是我的母语,所以我什至不知道 "stub" 这个词的实际含义,也没有我的语言的翻译。

文档中说:

When a calling strategy is used for a spy, the original stubbing behavior can be returned at any time with and.stub.

describe("A spy", function() {  

var foo, bar = null;

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

    spyOn(foo, 'setBar').and.callThrough();
  });

  it("can call through and then stub in the same spec", function() {
    foo.setBar(123);
    expect(bar).toEqual(123);

    foo.setBar.and.stub();
    bar = null;

    foo.setBar(123);
    expect(bar).toBe(null);
  });
});

and.stub 到底有什么用,它有什么用?

关于术语,您可以查看维基百科:http://en.wikipedia.org/wiki/Test_stub

简而言之,它是一个您可以控制的 "fake" 对象,用于替换代码中的 "real" 对象。

对于函数,我的理解是and.stub()去除了and.callThrough()对间谍的影响。

当您调用 and.callThrough 时,间谍充当代理,调用真正的函数,但通过间谍对象允许您添加像期望一样的测试。

当您调用 and.stub 时,或者如果您从不调用 and.callThrough,间谍将不会调用真正的函数。当您不想测试对象的行为但要确保它已被调用时,它非常有用。帮助您保持测试真正单一。

完成上一个答案:

的确,文档上看的不是很清楚,但是源码里写的很清楚:

https://github.com/jasmine/jasmine/blob/4be20794827a63ca5295848c58ffc478624ee4dc/src/core/SpyStrategy.js

plan = function() {};

->调用的函数为空

this.callThrough = function() {
  plan = originalFn;

->调用的函数是原函数

this.stub = function(fn) {
  plan = function() {};

-> 调用的函数为空(再次)