2015-01-03 9 views
6

Czy istnieje prosty sposób na kpiny z obiektu/funkcji hapi reply dla łatwego testowania jednostkowego?jak wykpić odpowiedź hapi.js z sinonem na testowanie jednostki

Przykłady, które widzę dla hapi, wszystkie używają server.inject i framwork "lab" do testowania. Jestem ciekawy, jak mogę dalej używać mocha i chciałbym przetestować kontroler bezpośrednio, zamiast wstrzykiwać go do serwera.

Czy należy używać sondy do kpiny z obiektu odpowiedzi?

testów/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 

    }); 

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

    } 
} 

Wreszcie, należy po prostu przełączyć się do laboratorium, a nie?

Odpowiedz

3

Możesz użyć server.inject() również z Mocha. Chciałbym tylko skrótową Post.save():

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

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

Z trochę więcej kodu:

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

Jeśli chcesz przetestować za błąd, wystarczy zmodyfikować niedopałek:

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

więc kiedy ogłaszasz zatrzask sinon na zapisie post, czy zastąpi metodę zapisu, którą wywoła kontroler serwera? – MonkeyBonkey

+0

@MonkeyBonkey Tak, będzie. –

Powiązane problemy