2014-12-13 9 views
5

Mi scuso se questa è una domanda semplice, sono relativamente nuovo a Nodo e Sinone. Sto faticando a cercare di capire come affermare che una funzione asincrona annidata è stata chiamata in Nodejs.Sinone - come disattivare la funzione annidata?

Sto usando mocha, chai, sinon e richiesta (https://github.com/request/request) ma penso che manchi qualcosa di base sulla parte di stub.

Esempio all'interno my_app.js -

var request = require('request'); 

function MyModule() { 
}; 

MyModule.prototype.getTicker = function(callback) { 
    request('http://example.com/api/ticker', function(error, response) { 
     if (error) { 
      callback(error); 
     } else { 
      callback(null, response); 
     } 
    }); 
}; 

exports.mymodule = new MyModule(); 

All'interno del test. Sto provando a bloccare la chiamata per richiedere e fornire alcuni dati fittizi da restituire. Ma continuo a ricevere un errore "richiesta non è definito" sulla linea in cui I "m creare lo stub.

var myApp = require('../my_app.js') 
    ,assert = require("assert") 
    ,chai = require('chai') 
    ,sinon = require('sinon') 
    ,expect = chai.expect; 

describe('mymodule object', function() { 

    var mymodule = myApp.mymodule; 

    before(function(done) { 
     sinon.stub(request).yields(null, JSON.stringify({ 
      price: '100 USD' 
     })); 
     done(); 
    }); 

    it('getTicker function should call request on example ticker', function(done) { 
     mymodule.getTicker(function(error, result){ 
      request.called.should.be.equal(true); 
      done(); 
     }); 
    }); 

}); 

so di poter assegnare sinon.stub (objname, "funcname") o sinon.stub ("funcname"), ma quelli solo impostano l'oggetto esterno, sto provando a stub la richiesta di funzione che si trova nella funzione getTicker

Qualche idea su come fare? Forse ho bisogno di usare anche una spia (ma come?) O c'è un approccio migliore per testare la funzione getTicker sopra?

risposta

6

Si riceve il messaggio non definito perché la variabile request non è nota con n lo scopo del test. Tuttavia, anche se dovessi correggere ciò e assegnare la variabile request alla variabile, riceverai comunque un errore in quanto sinon richiede un metodo su qualsiasi oggetto fornito per creare uno stub.

La conseguenza di tale è che la funzione request non può essere definita come non esiste su un oggetto ma come funzione su cui sono definiti altri metodi. Pertanto, per supportare la testabilità, sarebbe preferibile rinunciare all'utilizzo di request direttamente nel codice e utilizzare invece i metodi allegati che possono quindi essere stubati. Ad esempio:

my_app.js

MyModule.prototype.getTicker = function(callback) { 
    request.get('http://example.com/api/ticker', function(error, response) { 
    ... 
    }); 
}; 

my_test.js

var request = require('request'); 

before(function() { 
    sinon.stub(request, 'get').yields(null, JSON.stringify({price: '100 USD'})); 
}); 

it('getTicker function should call request on example ticker', function() { 
    mymodule.getTicker(); 
    request.get.called.should.be.equal(true); 
}); 

(Si noti che la corsa moka asincrono è non necessarie quando uno stub è sincrona).

+0

Ok fantastico, non ho pensato di usare il metodo get su questo. Ora posso anche usare una spia per verificare che la richiamata sia stata invocata credo. –

+0

Ah, sì, posso verificare che sia stata richiamata la richiamata. ma sto usando una sintassi leggermente diversa 'mymodule.getTicker (callback);' 'request.get.should.have.been.called;' e 'request.get.should.have.been.called;' Grazie mille ! –

Problemi correlati