【问题标题】:how to mock object created via require如何模拟通过require创建的对象
【发布时间】:2014-04-10 03:06:28
【问题描述】:

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

相反,通常使用 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();
        });
    });

【问题讨论】:

    标签: javascript node.js mocking mocha.js


    【解决方案1】:

    这是通过proxyquire 完成的。

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

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

    【讨论】:

    • 好的,我已经知道如何通过proxyquire 存根模块函数,但对于传入的任何参数只有一个通用存根。如何为特定的 args 值存根特定的返回值? (通常用 moq 和 rhino 做)
    • 显然使用proxyquire 要超越琐碎的存根,您必须创建一个完全模拟的模块。我的模块有一个属性实例化为具有原型函数的函数的实例,所以我需要存根myModule.myProperty.read(id)。这可以用proxyquire 完成而不用编码mockMyModule 吗?
    • @BaltoStar 你似乎需要sinon.js 之类的东西。查看他们的“功能一览”部分(几乎在主页的底部)。
    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多