2014-01-07 5 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 

ответ

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

5

.callCount является собственностью spy.

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 

Возможно шпион не является правильным аналогия. A 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', где вы думали, что это будет. –

Смежные вопросы