【问题标题】:How to have different fake functions called for multiple calls on a Jasmine spy如何为 Jasmine 间谍的多次调用调用不同的假函数
【发布时间】:2017-02-08 00:34:12
【问题描述】:

假设我在监视这样的方法:

spyOn(util, "foo").andCallFake(function() {
    //some code
});

被测函数多次调用 util.foo。

是否可以让间谍在每次下一次调用时调用不同的假函数?

这个问题类似于这个问题:How to have different return values for multiple calls on a Jasmine spy 但我需要调用一个函数而不是返回值。 如果没有原生的方法,我该如何“重置”间谍来解决问题?

【问题讨论】:

    标签: javascript unit-testing jasmine


    【解决方案1】:

    以下是如何将您的间谍路由到实际调用,直到它被用于较早地伪造方法之后的第二次/后续时间。

    我觉得这说明了您一直在努力实现的目标。 Fiddle to see it in action

    var util = {
      foo: function() {
        console.log("Foo has been called")
      }
    }
    
    someFunction = function() {
      console.log("lets call utils foo");
      util.foo();
      console.log("lets call utils foo one more time");
      util.foo();
      console.log("lets call utils foo one last time");
      util.foo();
    }
    
    describe("spec to util's foo multiple times", function() {
      it('test', function() {
        var self = this;
        self.resetSpy = function() {
          self.spyVar.and.callThrough();
        };
        self.spyVar = spyOn(util, 'foo').and.callFake(function(e) {
          console.log("Foo hasn't been called, instead a Fake method has been called")
          self.resetSpy();
        });
        someFunction();
        expect(util.foo).toHaveBeenCalled();
      });
    });
    

    注意事项:

    • someFunction 是调用util.foo 3 次的函数。
    • 假设你想伪造一次,但接下来的两个电话你想伪造 实际调用函数本身,那么我们可以初步设置spy 但是对于第二次和第三次调用使用假方法,我们重置 间谍实际上是callThrough
    • self.resetSpy 是我在第一次 spy 调用后调用的规范的内部函数。
    • 更多关于重置间谍的信息是here

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      为什么不在它周围包裹一个匿名函数:

      var count=0;
      event.on(function(){
      count++;
      if(count==1){
      //at first
      firstfunc();
      }else{
      //the rest
      secondfunc();
      }
      });
      

      【讨论】:

      • 能否将其用于间谍和假电话,因为我不明白如何调整您的答案?
      • 只需将 event.on 替换为 spyOn().andCallFake(
      猜你喜欢
      • 2015-01-09
      • 2023-03-20
      • 2019-02-05
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2023-03-06
      相关资源
      最近更新 更多