【问题标题】:Jasmine Spies.and.stub methodJasmine Spies.and.stub 方法
【发布时间】:2015-03-16 12:34:27
【问题描述】:

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

在文档中它说:

当一个调用策略用于spy时,可以随时用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 的实际作用是什么?它有什么用处?

【问题讨论】:

    标签: javascript unit-testing jasmine


    【解决方案1】:

    关于这个词,你可以看看维基百科:http://en.wikipedia.org/wiki/Test_stub

    简而言之,它是一个您可以控制的“假”对象,它取代了代码中的“真实”对象。

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

    当您调用and.callThrough 时,spy 充当代理,调用真正的函数,但通过 spy 对象允许您添加类似期望的测试。

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

    【讨论】:

    • 非常感谢。 and.stub() 消除了 and.callThrough() 的影响这一事实是他们的文档中缺少的。它真的解释了一切。
    • 与没有.and.callThrough()spyOn(foo, 'setBar')有什么不同?
    • 同意艾卡纳达尔。 stubspyOn 的用途是什么似乎做同样的事情。如果我做spyOn(foo,'setBar')setBar 的原始实现将不会被调用。事实上,stub 似乎与调用and.callFake(()=>{}) 相同
    • jasmine 在其语法中混合了 spy 和 stub 的概念。存根替换实现,其中间谍仅行为具有调用实际实现的直通。要拥有真正的间谍,您需要做spyOn(..).and.callThrough()。但是您可以在调用callThrough 后使用and.stub 重新启用存根。同意主要是糖! and.callFake 有类似的结果。
    • @ManuChadha 你现在可能已经知道了,但万一阅读这些 cmets 的人仍然感到困惑:关键是在你改变了 spy 的行为之后,有办法将间谍重置为默认行为对于给定的测试,带有.and.callThrough()and.callFake() 等的间谍,例如,如果您不希望通过该间谍运行的其他测试调用或调用虚假行为。
    【解决方案2】:

    完成上一个答案:

    确实,从文档上看不太清楚,但是在源码里很清楚:

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

    plan = function() {};
    

    ->被调用函数为空

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

    ->被调用的函数是原来的函数

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-24
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-26
      相关资源
      最近更新 更多