茉莉花间谍不工作

时间:2014-01-07 13:50:56

标签: javascript jasmine

给出以下代码(页面中包含Jasmine):

  function MyCtorFn() {
    this.myMethod = function() {
          console.log("hello world")
      }
  }

  //arrange
  var myCtrFn = new MyCtorFn();
  spyOn(myCtrFn, 'myMethod');

  //act
  myCtrFn.myMethod();

为什么以下返回未定义?

myCtrFn.myMethod.callCount

2 个答案:

答案 0 :(得分:5)

.callCountspy的属性。

function MyCtorFn() {
this.myMethod = function() {
      console.log("hello world")
  }
}

//arrange
var myCtrFn = new MyCtorFn();
var spy = spyOn(myCtrFn, 'myMethod');

//act
myCtrFn.myMethod();

spy.callCount; // 1

实际上,它不起作用很奇怪,因为spyOn方法应该用间谍取代原始方法。

请参阅https://github.com/pivotal/jasmine/blob/master/lib/jasmine-core/jasmine.js582

我个人认为这是非常奇怪的行为。这将导致与其他框架的各种不兼容性。如果你有两个茉莉花实例并且它们都试图窥探相同的功能怎么办?很奇怪。

这就是为什么我认为这些属性仅限于间谍。

间谍的全部意义在于你无法察觉吗?

var trustedFunction = function () {};
var obj = {
    foo: trustedFunction
}
spyOn(obj, "foo");
obj.foo === trustedFunction; // false? BUSTED

也许间谍不是正确的类比。 CallTrackerWrapper将是一个不那么邪恶和谦虚的名字。

答案 1 :(得分:3)

获取间谍呼叫计数的记录方式是通过calls属性:

myCtrFn.myMethod.calls.count() // 1

文档:http://jasmine.github.io/2.0/introduction.html#section-23

查看来源,似乎其他任何地方都无法获取此信息:https://github.com/pivotal/jasmine/blob/master/src/core/CallTracker.js https://github.com/pivotal/jasmine/blob/master/src/core/base.js#L75