【问题标题】:Jasmine: How to properly spy on a function call?Jasmine:如何正确监视函数调用?
【发布时间】:2017-02-27 18:39:31
【问题描述】:

我正在尝试在下一个场景中测试函数调用:

JS:

var Demo = function(option) {
  if (option) func();

  function func() {
    console.log('called')
  }

  return {
    'func': func
  }
}

茉莉花:

beforeEach(function() {
  var demo = new Demo(true);
  spyOn(demo, 'func');

  this.demo = demo;
});

it("should call func()", function() {
  expect(this.demo.func).toHaveBeenCalled();
});

尽管它在控制台中记录了'called',但它使规范失败:

预期的间谍函数已被调用。

从代码流来看,我想这是因为间谍开始在函数被调用之后。所以我的问题 - 在测试中捕获函数调用的正确方法是什么?

JSFiddle

【问题讨论】:

    标签: javascript jasmine


    【解决方案1】:

    这可能是一个更好的方法来做到这一点。添加func 作为演示原型的一部分。然后你可以将间谍连接到原型。

    var Demo = function(option) {
      if (option) this.func();
    }
    
    Demo.prototype.func = function(){
        console.log("called")
    }
    
    beforeEach(function() {
        spyOn(Demo.prototype, 'func')
      var demo = new Demo(true);
      this.demo = demo;
    });
    
    it("should call func()", function() {
      expect(this.demo.func).toHaveBeenCalled();
    });
    

    http://jsfiddle.net/kfu7fok1/6/

    【讨论】:

    • 谢谢。我见过this answer - 只是想知道是否有其他方法可以实现这一目标。
    • 是的,正如您指出的那样,当您在原始问题中连接间谍时,该函数已经被调用。用原型做这件事确实有性能优势。在您最初的问题中,每次创建一个新的 Demo 对象时,您都会得到一个 func 的新实例。与 Demo.prototype.func 所有实例通过原型共享它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多