2014-07-24 5 views
6

sto lavorando in node.js. La mia app interagisce con Redis tramite il modulo node_redis. Sto usando mocha e sinon per automatizzare i test della mia app. La mia app ha un aspetto simile al seguente:interazioni Stubbing Redis in JavaScript utilizzando Sinon

...snip 
var redisClient = redis.createClient(redisPort, redisHost); 
var someValue = redisClient.get("someKey"); 
return someValue; 
.... 

Desidero interrompere la chiamata a redisClient.get(). Per fare questo ho anche bisogno di stub la chiamata a redis.createClient() - credo ... Ecco il mio codice di prova:

... 
var redis = require("redis"); 
var redisClient; 
... 
sinon.stub(redisClient, 'get').returns("someValue"); 
sinon.stub(redis, "createClient").returns(redisClient); 
... 
assert.equal(redis_client_underTest.call_to_redis(), "someValue"); 
... 

Il test fallisce con AssertionError: false == "someValue"

Come faccio a spegnere redisClient, o è anche possibile?

risposta

3

Che cosa si potrebbe fare è usare qualcosa come Proxyquire o Rewire. Userò rewire per l'esempio.

tuo frammento di codice che si desidera stub:

var redisClient = redis.createClient(redisPort, redisHost); 
var someValue = redisClient.get("someKey"); 
return someValue; 

Poi, nel tuo test che si può usare ReWire:

var Rewire = require('rewire'); 

var myModule = Rewire("../your/module/to/test.js"); 

var redisMock = { 
    get: sinon.spy(function(something){ 
      return "someValue"; 
     }); 
}; 

myModule.__set__('redisClient', redisMock); 

In questo modo si può avere la redisClient sostituito e si può verificare con il spiare se la funzione è stata chiamata.

+0

La variabile redisClient deve essere esposta? Oppure questo può riconnettere variabili private anche nei moduli? – Scotty

+1

@Scotty Sì, può ricablare anche variabili private. :) – Osukaa

+0

Cambio di gioco! Grazie mille! : D – Scotty