如何模拟通过require创build的对象

我是node.js的新手,在大多数代码中,我没有看到依赖关系的IoC / DI样式构造函数注入。

相反,通常使用node.js扩展require()来创build允许访问外部模块导出的本地variables。

但是当编写unit testing(隔离单层/函数)时,如何模拟通过使用require创build的variables访问的模块?

/helpers/dataHelper.js var dataModel = require('../models/dataModel.js'); var getFormattedDataForRegion = function(region, callback) { var data = {}; // validate region // query dataModel // async.map format data items // callback(data); } /tests/dataHelperTests.js describe('dataHelper', function(){ it('getFormattedDataForRegion returns expected response', function(done){ var expectedData = {}; // populate expectedData // **** need some way to mock dataModel ***** dataHelper.getFormattedDataForRegion("west", function(data){ expect(data).to.eql(expectedData); done(); }); }); 

这是用proxyquire完成的。

我个人不喜欢这种技术,但是这是我发现尊重“节点方式”并且仍然能够轻松testing的最好方法。 你会这样做:

 var proxyquire = require('proxyquire'), dataModelMock = require('./mocks/dataModel'); proxyquire('path/to/helpers/dataHelper.js', { '../models/dataModel.js': dataModelMock });