【问题标题】:how to mock hapi.js reply with sinon for unit testing如何用 sinon 模拟 hapi.js 回复以进行单元测试
【发布时间】:2015-03-01 15:11:00
【问题描述】:

有没有简单的方法来模拟 hapi 回复对象/函数以便于进行单元测试?

我看到的 hapi 示例都使用 server.inject 和“实验室”框架进行测试。我很想知道如何继续使用 mocha,并且想直接测试控制器而不是注入服务器。

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

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

  });

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

    }
}

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

【问题讨论】:

    标签: javascript unit-testing sinon hapijs


    【解决方案1】:

    您也可以在 Mocha 中使用 server.inject()。我只会存根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();
        });
    });
    

    【讨论】:

    • 那么当你在 post save 上声明 sinon stub 时,它会覆盖服务器控制器调用的 save 方法吗?
    • @MonkeyBonkey 是的,会的。
    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 2023-04-01
    • 2021-03-15
    • 2017-04-26
    • 2013-11-18
    • 1970-01-01
    • 2016-12-21
    • 2018-04-04
    相关资源
    最近更新 更多