hyp*_*ack 5 mysql node.js sinon chai
我有一个expressjs带有以下routes和middleware模块的应用程序.我想测试使用的路由模块mocha,chai,http-chai和sinonjs.API使用mysql并且为了测试路由模块,我将它全部模块化,以便我可以存根mysql模块.但是,当我试图存根时middleware/index,我遇到了麻烦.如果我尝试index正常要求,模块实际上并没有被截断.如果我尝试使用它require.cache[require.resolve('./../../lib/routes/middleware/index')];,它似乎存根,但indexStub.returns(indexObj)返回错误TypeError: indexStub.returns is not a function和TypeError: indexStub.restore is not a function.
如何index.js正确地存根以控制代码流并防止它尝试连接到mysql?
routes.js
'use strict';
const express = require('express');
const router = express.Router();
const configs = require('./../config/configs');
const middleware = require('./middleware/index');
const bodyParser = require('body-parser');
const useBodyParserJson = bodyParser.json({
verify: function (req, res, buf, encoding) {
req.rawBody = buf;
}
});
const useBodyParserUrlEncoded = bodyParser.urlencoded({extended: true});
// creates a new post item and return that post in the response
router.post('/posts', useBodyParserUrlEncoded, useBodyParserJson, middleware.validatePostData, middleware.initializeConnection, middleware.saveNewPost, middleware.closeConnection, function(req, res) {
if (res.statusCode === 500) {
return res.send();
}
if (res.statusCode === 405) {
return res.send('Item already exists with slug ' + req.body.slug + '. Invalid method POST');
}
res.json(res.body).end();
});
module.exports = router;
Run Code Online (Sandbox Code Playgroud)
中间件/ index.js
'use strict';
const configs = require('./../../config/configs');
const database = require('./../../factories/databases').select(configs.get('STORAGE'));
const dataV = require('./../../modules/utils/data-validator');
module.exports = {
initializeConnection: database.initializeConnection, // start connection with database
closeConnection: database.closeConnection, // close connection with database
saveNewPost: database.saveNewPost, // creates and saves a new post
validatePostData: dataV.validatePostData, // validates user data
};
Run Code Online (Sandbox Code Playgroud)
SPEC-routes.js
'use strict';
var chai = require('chai');
var chaiHttp = require('chai-http');
var sinonChai = require("sinon-chai");
var expect = chai.expect;
var sinon = require('sinon');
chai.use(sinonChai);
chai.use(chaiHttp);
var app = require('./../../app');
describe('COMPLEX ROUTES WITH MIDDLEWARE', function() {
var indexM = require.cache[require.resolve('./../../lib/routes/middleware/index')];
describe('POST - /posts', function() {
var indexStub,
indexObj;
beforeEach(function() {
indexStub = sinon.stub(indexM);
indexObj = {
'initializeConnection': function(req, res, next) {
return next();
},
'closeConnection': function(req, res, next) {
return next();
},
'validatePostData': function(req, res, next) {
return next();
}
};
});
afterEach(function() {
indexStub.restore();
});
it('should return a 500 response', function(done) {
indexObj.saveNewPost = function(req, res, next) {
res.statusCode = 500;
return next();
};
indexStub.returns(indexObj);
chai.request(app)
.post('/posts')
.send({'title': 'Hello', 'subTitle': 'World', 'slug': 'Example', 'readingTime': '2', 'published': false})
.end(function(err, res) {
expect(res).to.have.status(500);
done();
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
您根本不使用Sinon,因为它根本不处理模块加载。我看到您已经开始使用内部 Node API 手动执行此操作,但我建议您按照我们在 Sinon 文档中建议的有关此用例的方式执行此操作: juse use proxyquire。
它使您能够将调用替换require为./middleware/index.js您自己喜欢的模拟对象(可能使用 sinon 进行)。
你会像这样使用它:
var myIndex = {
initializeConnection: sinon.stub(),
closeConnection: sinon.stub(),
saveNewPost: sinon.stub()
};
var app = proxyquire('./../../app', {'./middleware/index': myIndex});
Run Code Online (Sandbox Code Playgroud)