如何模仿hapi.js回复sinon进行单元测试

时间:2015-01-03 15:41:44

标签: javascript unit-testing sinon hapijs

是否有简单的方法来模拟hapi应答对象/函数以便于单元测试?

我看到hapi的例子都使用了server.inject和" lab"用于测试的框架。我很想知道如何继续使用mocha并且想直接测试控制器而不是注入服务器。

我应该使用sinon来模拟回复对象吗?

测试/ 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

  });

控制器/ 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));
        }
      });

    }
}

最后,我应该切换到实验室吗?

1 个答案:

答案 0 :(得分:3)

您也可以将server.inject()与Mocha一起使用。我只会存根Post.save()

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

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

使用更多代码:

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

如果要测试错误,只需修改存根:

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