2011-11-05 20 views
33

¿Hay una manera conveniente de burlarse de los objetos HTTP Request and Response para middlewares de prueba de unidad?node.js: Mock http request and response

+0

¿Hay algún motivo por el que no incluya solicitudes HTTP reales en su caso de prueba? Debería ser reallx factible en una configuración de prueba asíncrona. –

+9

Fui con eso, pero para ser sincero, no parece una prueba de unidad, es más como una integración. De todos modos, hasta ahora esa es mi mejor opción. – 7elephant

+4

No quiero incluir solicitudes http reales porque hace que mis pruebas sean más lentas y menos confiables. Por ejemplo, si uno de los servicios a los que llamo tiene respaldo de DB, y falla porque el DB en QA ha sido borrado (o sincronizado con prod, o lo que sea) entonces mis pruebas comienzan a fallar. Además, si no se burla, es casi imposible forzar de forma confiable ciertos casos de error. No, me gustan los simulacros: hacen que las pruebas sean más fáciles y confiables. – Kevin

Respuesta

1

estoy usando simulacro nodejutsu:

https://github.com/nodejitsu/mock-request

Tal vez esto es lo que busca.

+4

El proyecto está en desuso. La recomendación es usar "nock" https://github.com/flatiron/nock –

+3

nock no funciona para restaurar solicitudes http. – Kevin

1

escribí una biblioteca para burlarse de las respuestas de las solicitudes realizadas a través de HTTP estándar o mediante el modelo de solicitud:

https://github.com/ctide/fakeweb

7

Desde la etiqueta, parece que esta pregunta es sobre Express. En ese caso, supertest es muy buena:

var request = require('supertest') 
    , express = require('express'); 

var app = express(); 

app.get('/user', function(req, res){ 
    res.send(201, { name: 'tobi' }); 
}); 

request(app) 
    .get('/user') 
    .expect('Content-Type', /json/) 
    .expect('Content-Length', '20') 
    .expect(201) 
    .end(function(err, res){ 
    if (err) throw err; 
    }); 

Para uso general Nodo, Flatiron Nock parece una buena opción:

var nock = require('nock'); 
var example = nock('http://example.com') 
       .get('/foo') 
       .reply(200, { foo: 'bar' }); 

var http = require('http'); 
var options = { 
    host: 'example.com', 
    port: 80, 
    path: '/foo', 
    method: 'GET' 
} 
var req = http.request(options, function(res) { 
    res.on('data', function(chunk) { 
    console.log('BODY: ' + chunk); 
    }); 
}); 

req.on('error', function(e) { 
    console.log('error: ' + e); 
}); 

req.end(); 

Salida:

CUERPO: { "foo": "barra "}

+0

+1 para nock, herramienta muy útil. – undefined

+1

Esta es una publicación anterior. Pero tengo una pregunta. supertest, que tiene 'request (app)', parece iniciar un servidor (https://github.com/tj/supertest/blob/master/index.js#L20), y no se burla de los requisitos de http. ¿Es eso cierto? – NullSpace

0

Mockery se ve muy bien para esto.

Básicamente secuestra require llamadas y devuelve un objeto/función diferente que especifique.

0

Lo invito a usar motty. ¿Por qué necesitamos otro código?