javascript - que - Prueba de solicitudes fallidas en el nodo
html dom javascript tutorial (1)
Tengo un código que se parece a lo siguiente:
var request = require(''request'');
function Service(){
this._config = require(''../path/to/config.json'');
}
Service.prototype.doThing = function(){
return new Promise(function(resolve, reject){
request.post(url, {payload}, function(error, response, body){
//handle response
resolve(true);
}).on(''error'', function(err){
//handle errors
resolve(false);
});
});
}
Estoy tratando de probar el bloque que se ejecuta por error, pero que tiene dificultades debido a la promesa. Estoy usando mocha para ejecutar la prueba y sinon para el troquelado. Puedo completar la solicitud para que pueda contar la cantidad de veces que se llama al método on, pero la promesa que lo contiene nunca se resuelve.
Hay algunos paquetes que funcionan con sinon para manejar las promesas (he intentado sinon-as-prometido y sinon-stub-promise), pero tengo que colgar todo el método de doThing para que se resuelva correctamente. Agradecería cualquier comentario sobre la forma adecuada de probar este código o las estructuras de código alternativo que pueden ser más fáciles de probar.
La prueba en cuestión (que se cuelga esperando la promesa de devolución) está a continuación:
context(''when the server is unavailable'', function(){
beforeEach(function() {
var onStub = sinon.stub();
requestStub = {post: function(){ return {on: onStub}}};
Service = proxyquire(''path/to/service'', {request: requestStub});
service = new Service();
});
it(''should not set the auth key'', function(){
return service.doThing().then(function(x){
return assert(onStub.calledOnce);
});
});
});
¡Gracias!
Para resumir lo obvio, su problema aquí es que no controla el objeto de request
, o más bien la respuesta de su método de post
. Si puede controlar eso, podrá probar todas las diferentes rutas de código en su método doThing
.
Usted tiene tres posibilidades para controlar la respuesta de la request
:
- Rellene la capa de red (usando algo como Nock ) para que pueda controlar lo que la capa HTTP está entregando a la biblioteca de
request
. - Use la inyección de dependencia para inyectar un stub que se puede usar en lugar de
request.post
(se requerirá una modificación del código) - Utilice una costura de enlace para sustituir el objeto devuelto por
require()
con un objeto stub que controle. Esto es por supuesto lo que has hecho.
Personalmente, habría optado por la opción 2, ya que no requiere un marco adicional, es fácil razonar y es fácil de implementar. Puede referirse a este ejemplo bastante elaborado , pero el código necesario en su caso es mínimo.
De todos modos, como has elegido la opción 3, también podría seguir esa ruta :-) El problema es cómo terminaste el método de post
. ¿Ha llamado alguna vez a su devolución de llamada?
Cambiaría el talón de la post
a algo como esto:
post: (url, options, cb) => {
cb(null, null, null); // will resolve your promise in the module
return { on: onStub };
}
Por supuesto, los null
pasados a su devolución de llamada pueden ser otra cosa si necesita hacer algo con los valores más adelante.