Creando talonario de solicitud con sinon en mocha

Estoy usando mocha para probar algunas clases y necesito crear un código auxiliar de la biblioteca de request .

Estoy usando sinon , y puedo crear un código auxiliar del método request.get pero no puedo crear un código auxiliar del método de request (las llamadas http intentan conectarse a un servidor). Como he leído, request.get es un alias para la request pero cuando apago request.get no tiene ningún efecto sobre las llamadas de request .

Este código funciona (usando request.get ):

En pruebas:

 request = require 'request' describe "User test", -> user = {} before (done) -> user = new test.user('Ander', 18) sinon.stub(request, 'get').yields(null, {statusCode: 200}, 'foo') done() after (done) -> request.get.restre() done() it "testing server response", -> user.getData().should.equal 'ander' 

En fuente:

 request = require 'request' class User contructor(@name, @age): -> getData: -> mydata = '' request.get 'http://127.0.0.1:8080/', (err, response, body) -> if not err and response.statusCode == 200 mydata = body else err = throw new Error "Errorea" mydata 

Pero esto no funciona (intenta conectarse a la url suministrada):

En pruebas:

 request = require 'request' describe "User test", -> user = {} before (done) -> user = new test.user('Ander', 18) sinon.stub(request, 'Request').yields(null, {statusCode: 200}, 'foo') #Creating the stub this way, doesn't work neither #sinon.stub(request, 'get').yields(null, {statusCode: 200}, 'foo') done() after (done) -> request.Request.restre() done() it "testing server response", -> user.getData().should.equal 'ander' 

En fuente:

 request = require 'request' class User contructor(@name, @age): -> getData: -> mydata = '' request 'http://127.0.0.1:8080/', (err, response, body) -> if not err and response.statusCode == 200 mydata = body else err = throw new Error "Errorea" mydata 

¿Cuál es la forma correcta de crear un apéndice para la llamada de request ? ¿Cuál es el método para ser stubed?

Aunque la request es una gran biblioteca, no es un buen ejemplo de API bien estructurada. Y debido a que la request módulo se define como una función con métodos adicionales (de manera similar a express ), ya que sé que no se puede crear un código auxiliar para la request función con sinon .

Lo mejor que puedes hacer es evitar usar la función de request en tu código y usar solo request.get , request.post , etc., que puedes astackr fácilmente.

La creación de un código auxiliar para la Request en su segundo ejemplo no ayuda porque la solicitud no es un método, consulte el código fuente .

Si alguien todavía está buscando una respuesta para esto, parece que puede crear un talón de solicitud utilizando sinon:

 before(function(done){ sinon .stub(request, 'get') .yields(null, null, JSON.stringify({login: "bulkan"})); done(); }); 

más detalles se pueden encontrar aquí

Como se mencionó en una de las respuestas a la pregunta ¿Cómo simular una solicitud y respuesta en nodejs para probar middleware / controladores? , el paquete node-mocks-http proporciona una manera de generar simulacros de solicitud y respuesta.

Otra solución sería generar un código auxiliar utilizando el módulo sinon y la dependencia de la solicitud en el módulo correspondiente se puede anular mediante el uso de proxyquire .

 var sinon = require('sinon'); var proxyquire = require('proxyquire'); describe('something', function(){ var request; var overriddenModule; before(function(){ request = sinon.stub(); // overriding the 'request' dependency with the stub overriddenModule = proxyquire('path_to_module_using_request', {'request': request}); }); it("should do something",function(done){ // stubbing the request(options,callback) method request.withArgs(sinon.match.any,sinon.match.any).yields(null,null,responseBody); overriddenModule.method_which_is_doing_request; // our logic and assertions before calling done() }); }); 

Para obtener más información, consulte este artículo sobre Pruebas unitarias con simulacros en el nodo