nodejs – stub module.exports函数与sinon

我有一个expressjs应用程序与以下routesmiddleware模块。 我正在尝试使用mochachaihttp-chaisinonjs来testing路线模块。 该API使用mysql和为了testing路由模块,我把它全部模块化,以便我可以将mysql模块存根。 但是,当我尝试存根middleware/index ,我有麻烦。 如果我试图正常要求index ,模块实际上并没有被扼杀。 如果我尝试使用require.cache[require.resolve('./../../lib/routes/middleware/index')]; ,它似乎stub东西,但indexStub.returns(indexObj)返回一个错误TypeError: indexStub.returns is not a functionTypeError: indexStub.restore is not a function

如何正确地存储index.js为了控制代码stream,并防止它试图连接到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; 

中间件/ 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 }; 

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