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

Bal*_*tar 5 javascript mocking mocha.js node.js

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

相反,通常node.js扩展名require()用于创建允许访问外部模块导出的本地变量.

但是在编写单元测试(隔离单层/函数)时,如何模拟通过使用require创建的变量访问的模块?

/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();
        });
    });
Run Code Online (Sandbox Code Playgroud)

Est*_*ban 1

这是通过proxyquire完成的。

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

var proxyquire =  require('proxyquire'),
    dataModelMock = require('./mocks/dataModel');

proxyquire('path/to/helpers/dataHelper.js', { '../models/dataModel.js': dataModelMock });
Run Code Online (Sandbox Code Playgroud)