2015-01-03 8 views
6

C'è un modo semplice per deridere l'oggetto/funzione risposta di hapi per un facile test dell'unità?come simulare la risposta di hapi.js con sinon per il test dell'unità

Gli esempi che vedo per hapi utilizzano tutti server.inject e il framwork "lab" per i test. Sono curioso di vedere come potrei continuare a usare mocha e vorrei testare direttamente il controller piuttosto che iniettarlo nel server.

Devo usare sinon per deridere l'oggetto risposta?

test/post.js

before(function() { 
    PostController = proxyquire('../controllers/post', { 'mongoose': mongooseMock }); 
    }); 


    it('should be able to create a post', function(done){ 

    var request.payload = {foo:bar}; 
    var reply = sinon.spy(); //is this how I should mock this? 
    PostController.create.handler(request, reply); 
    reply.should ...// how do I test for statuscode 201, Boom errors, and response msgs 

    }); 

controllori/post.js

var Boom = require('Boom') 
    Post = require('../models/Post') 
module.exports = { 

    create: { 
    auth: 'token', 
    handler: function (request, reply) { 

    var p = new Post({foo:request.payload.foo}); 
    p.save(function (err, results) { 
     if (!err && results) 
      reply(results).created(); 
     else { 
      reply(Boom.badImplementation(err)); 
     } 
     }); 

    } 
} 

Infine, devo solo passare al laboratorio, invece?

risposta

3

È possibile utilizzare anche server.inject() con Mocha. Vorrei solo stub Post.save():

Sinon.stub(Post, 'save', function (callback) { 

    callback(null, { foo: 'bar' }); 
}); 

Con un po 'più di codice:

it('creates a post', function (done) { 

    Sinon.stub(Post, 'save', function (callback) { 

     callback(null, { foo: 'bar' }); 
    }); 

    server.inject({ method: 'POST', url: '/posts', payload: { foo: 'bar' } }, function (res) { 

     Post.save.restore();  

     expect(res.statusCode).to.equal(201); 
     done(); 
    }); 
}); 

Se si desidera verificare per l'errore, basta modificare lo stub:

it('returns an error when save fails', function (done) { 

    Sinon.stub(Post, 'save', function (callback) { 

     callback(new Error('test'), null); 
    }); 

    server.inject({ method: 'POST', url: '/posts', payload: { foo: 'bar' } }, function (res) { 

     Post.save.restore();  

     expect(res.statusCode).to.equal(500); 
     done(); 
    }); 
}); 
+0

così quando dichiari il sinottico sinon sul post di salvataggio, sovrascriverà il metodo di salvataggio che il controller del server chiamerà? – MonkeyBonkey

+0

@MonkeyBonkey Sì, lo farà. –

Problemi correlati