如何模拟 hapi.js 回复 sinon 进行单元测试
how to mock hapi.js reply with sinon for unit testing
是否有简单的方法来模拟 hapi 回复 object/function 以便于进行单元测试?
我看到的 hapi 示例都使用 server.inject 和 "lab" 框架进行测试。我很想知道如何继续使用 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));
}
});
}
}
最后,我是否应该改用实验室?
您也可以将 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();
});
});
是否有简单的方法来模拟 hapi 回复 object/function 以便于进行单元测试?
我看到的 hapi 示例都使用 server.inject 和 "lab" 框架进行测试。我很想知道如何继续使用 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));
}
});
}
}
最后,我是否应该改用实验室?
您也可以将 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();
});
});