2014-01-07 47 views
3

考慮下面的代碼(茉莉包含在頁面):茉莉花間諜工作不

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

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

    //act 
    myCtrFn.myMethod(); 

爲什麼以下返回未定義?

myCtrFn.myMethod.callCount 

回答

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將是一個不太邪惡和更謙虛的名字。

+0

啊,好的,謝謝你清理我的誤解。 – Ben

+0

另外,我想你可以使用'myCtrFn.myMethod.calls.count()'http://jasmine.github.io/2.0/introduction.html#section-23 – Tibos

+0

@Ben:顯然它不只是你,除非你寫了[這個cheatsheet](http://tobyho.com/2011/12/15/jasmine-spy-cheatsheet/),它清楚地顯示了'callCount'是你認爲它會是的地方。 –