2015-07-04 8 views
7

Vorrei utilizzare i doppi di prova nei miei test dell'unità coffeescript per aiutare nella separazione delle preoccupazioni.Perché questo Sinon mock ha un metodo deriso che non è una funzione?

Sto usando Sinon con la moka

sto cercando quello che a questo punto sembra uscito da the documentation, che ha questo esempio di utilizzo finta (nel contesto di un'applicazione Rails con 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); 

Nel mio caso sto cercando di prendere in giro una chiamata di funzione su un oggetto come segue:

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

Questo dà un TypeError che indica che getContext non è una funzione:

TypeError: canvas.getContext is not a function

Il simulatore sembra essere configurato e verificato correttamente. Quando omettendo la chiamata a getContext, mi ha informato che l'aspettativa non è stata soddisfatta:

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

La JavaScript compilato si presenta così, allora:

var canvas; 

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

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

canvas.getContext('2d'); 

canvas.verify(); 

Cosa potrebbe spiegare questo errore?

Mi chiedevo se stavo facendo qualcosa di strano con l'argomento della funzione, ma posso riprodurre questo senza un argomento per la chiamata getContext.

risposta

9

Si sta provando a chiamare i metodi direttamente sul modello, ma questo non è il modo in cui Sinon.JS pensa ai mock. Si consideri ancora il codice di esempio:

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); 

Il soggetto in prova è myAPI, non mock. Nel caso precedente, funzionerà qualcosa del genere:

canvas_api = getContext: -> 
canvas_mock = sinon.mock(canvas_api) 
canvas_mock.expects("getContext").once() 
canvas_api.getContext() 
canvas_mock.verify() 
Problemi correlati