2015-04-22 13 views
10

Chciałbym sprawdzić, czy bar() jest wywoływane wewnątrz foo() z testu mojej jednostki.Sprawdzanie wywołania funkcji i sprawdzanie argumentów za pomocą szpiegów sinonowych

Pomyślałem, że może być odpowiedni Sinon spies, ale nie wiem jak z nich korzystać.

Czy istnieje sposób sprawdzenia, czy metoda jest wywoływana? Być może nawet wyodrębniając argumenty użyte w wywołaniu bar()?

var spy = sinon.spy(foo); 

function foo(){ 
    bar(1,2,3); 
} 

function bar(){ } 

foo(); 

// what to do with the spy? 

http://jsfiddle.net/8by9jg07/

Odpowiedz

14

W twoim przypadku, staramy się zobaczyć, czy bar nazwano, więc chcesz szpiegować bar raczej niż foo.

Jak opisano w doc:

function bar(x,y) { 
    console.debug(x, y); 
} 
function foo(z) { 
    bar(z, z+1); 
} 
// Spy on the function "bar" of the global object. 
var spy = sinon.spy(window, "bar"); 

// Now, the "bar" function has been replaced by a "Spy" object 
// (so this is not necessarily what you want to do) 

foo(1); 

bar.getCall(0).args => should be [1,2] 

Teraz szpiegostwo na wewnętrznych z funkcją silnie par swój test „foo” do jego realizacji, więc można wpaść w zwykłym "mockist vs classical" debaty.

+8

Według [the doc] (http://sinonjs.org/docs) powinno to być 'getCall (0)' zamiast 'getCalls (0)' –

1

Nie powinieneś szpiegostwo na pasku zamiast foo?

var spy = sinon.spy(bar) 

wywołać foo:

foo() 

Sprawdź bar nazwano:

console.log(spy.calledOnce) 
+0

Ta odpowiedź jest zła technicznie. Nie możesz [użyć 'spy() w ten sposób] (https://github.com/sinonjs/sinon/blob/v2.3.6/lib/sinon/spy.js#L19) - zajmuje obiekt i nazwa metody jako argument 1 i 2 (tak było również w przypadku starszych wersji w 2015 r.). Jeśli wywołana tylko z funkcją, to [tworzy anonimową funkcję szpiegowską nazwaną po zdarzeniu] (https://github.com/sinonjs/sinon/blob/v2.3.6/lib/sinon/spy.js#L135) i zwraca to, przekazane odniesienie nie jest zmienione. –

4

Zgadzam się z Adrianem mówiąc, że prawdopodobnie chciałeś szpiegować bar.

var barSpy = sinon.spy(bar); 

Następnie sprawdzić, czy została ona wywoływana raz

assert(barSpy.calledOnce); 

nazywany po prostu w ogóle

assert(barSpy.called) 

Called x ilość razy

assert.equal(barSpy.callCount, x); 

Jeśli chcesz wyodrębnić argumenty z pierwszego połączenia t on szpieg:

var args = barSpy.getCalls()[0].args 

Następnie możesz zrobić, co chcesz z tymi argumentami.

+0

Ta odpowiedź jest zła technicznie. Nie możesz [używać 'spy()' w ten sposób] (https://github.com/sinonjs/sinon/blob/v2.3.6/lib/sinon/spy.js # L19) - pobiera obiekt i nazwę metody jako argument 1 i 2 (tak było również w przypadku starszych wersji w 2015 roku). Jeśli wywołana tylko z funkcją, to [tworzy anonimową funkcję szpiegowską nazwaną po zdarzeniu] (https://github.com/sinonjs/sinon/blob/v2.3.6/lib/sinon/spy.js#L135) i zwraca to, przekazane odniesienie nie jest zmienione. –

Powiązane problemy