2015-07-04 8 views
7

Chciałbym użyć testu podwójnego w moich testach jednostkowych coffeescript, aby pomóc w rozdzieleniu obaw.Dlaczego ta sztuczka z Sinon ma wyśmiewaną metodę, która nie jest funkcją?

Używam sinon z mocha

Staram co w tym momencie wydaje się wprost z the documentation, który ma ten przykład makiety użytkowania (w kontekście aplikacji Rails z konacha.):

var myAPI = { method: function() {} }; 

var spy = sinon.spy(); 
var mock = sinon.mock(myAPI); 
mock.expects("method").once().throws(); 

PubSub.subscribe("message", myAPI.method); 
PubSub.subscribe("message", spy); 
PubSub.publishSync("message", undefined); 

mock.verify(); 
assert(spy.calledOnce); 

W moim przypadku Próbuję mock wywołanie funkcji na obiekcie, co następuje:

canvas = sinon.mock getContext: (arg) -> 
canvas.expects("getContext").once() 
canvas.getContext('2d') 
canvas.verify() 

daje to TypeError wskazując, że getContext nie jest funkcją:

TypeError: canvas.getContext is not a function

Egzamin wygląda na prawidłowo skonfigurowany i zweryfikowany. Kiedy pomijając wezwanie do getContext, jestem poinformowany, że oczekiwanie nie zostało spełnione:

ExpectationError: Expected getContext([...]) once (never called)

Skompilowany JavaScript wygląda tak, a następnie:

var canvas; 

canvas = sinon.mock({ 
    getContext: function(arg) {} 
}); 

canvas.expects("getContext").once(); 

canvas.getContext('2d'); 

canvas.verify(); 

Co może stanowić tego błędu?

Zastanawiam się, czy robiłem coś dziwnego z argumentem funkcji, ale mogę odtworzyć to bez argumentów do wywołania getContext.

Odpowiedz

9

Próbujesz wywoływać metody bezpośrednio na próbach, ale nie w ten sposób Sinon.JS myśli o mockach. Rozważmy przykładowy kod ponownie:

var myAPI = { method: function() {} }; 

var spy = sinon.spy(); 
var mock = sinon.mock(myAPI); 
mock.expects("method").once().throws(); 

PubSub.subscribe("message", myAPI.method); 
PubSub.subscribe("message", spy); 
PubSub.publishSync("message", undefined); 

mock.verify(); 
assert(spy.calledOnce); 

przedmiotem badanego jest myAPI nie mock. W powyższym przypadku zadziała coś podobnego do następującego:

canvas_api = getContext: -> 
canvas_mock = sinon.mock(canvas_api) 
canvas_mock.expects("getContext").once() 
canvas_api.getContext() 
canvas_mock.verify() 
Powiązane problemy