Sinon – ¿Cómo apalear la función anidada?

Disculpas si esta es una pregunta simple, soy relativamente nuevo en Node y Sinon. Estoy luchando para descubrir cómo afirmar que se llamó a una función asíncrona anidada en Nodejs.

Estoy usando mocha, chai, sinon y request ( https://github.com/request/request ) pero creo que me estoy perdiendo algo básico en la parte del apéndice.

Ejemplo dentro de 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(); 

Dentro de la prueba. Estoy intentando apagar la llamada para solicitar y proporcionar algunos datos ficticios para devolver. Pero sigo recibiendo un error “la solicitud no está definida” en la línea donde estoy creando el código auxiliar.

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

Sé que puedo asignar sinon.stub (objname, “funcname”) o sinon.stub (“funcname”), pero esos solo establecen el objeto externo, estoy tratando de rechazar la solicitud de función que está dentro de la función getTicker.

¿Alguna idea sobre cómo hacer esto? Tal vez necesito usar un espía también (¿pero cómo?) ¿O hay un mejor enfoque para probar la función getTicker anterior?

Está recibiendo el mensaje indefinido porque la variable de request es desconocida dentro del scope de su prueba. Sin embargo, incluso si corrigiera esto y asignara la biblioteca de request a la variable, seguiría recibiendo un error, ya que sinon requiere un método en cualquier objeto proporcionado para crear un código auxiliar.

La consecuencia de esto es que la función de request sí misma no se puede anular, ya que no existe en un objeto, sino como una función en la que se definen otros métodos. Por lo tanto, para poder probar la capacidad de prueba, sería preferible renunciar al uso de la request directamente en su código y, en su lugar, utilizar sus métodos adjuntos, que luego pueden eliminarse. Por ejemplo:

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

(Tenga en cuenta que ejecutar mocha de forma asíncrona no es necesario cuando un código auxiliar es síncrono).