我是node.js的新手,在大多数代码中,我没有看到IoC/DI样式构造函数依赖项的注入(inject)。
取而代之的是,通常使用node.js扩展require()创建本地变量,以允许访问外部模块的导出。
但是,当编写单元测试(隔离单个层/功能)时,如何模拟通过用require创建的var访问的模块?
/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完成的。
我个人不喜欢这种技术,但这是我发现尊重“Node 方式”并且仍然能够轻松进行测试的最佳方法。您可以:
var proxyquire = require('proxyquire'),
dataModelMock = require('./mocks/dataModel');
proxyquire('path/to/helpers/dataHelper.js', { '../models/dataModel.js': dataModelMock });