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

标签 javascript node.js mocking mocha.js

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

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

最佳答案

这是用 proxyquire 完成的.

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

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

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

关于javascript - 如何模拟通过 require 创建的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22977922/

相关文章:

Python 单元测试 : How to patch an entire class and methods

javascript - 将 PHP Heredoc 与 Javascript 模板文字相结合

javascript - 无法使用 Angular.js 添加带有文件名的随机数

javascript - 关于 express 消息。我无法获取我制作的模板

node.js - 从另一个人那里调用快速路线是不好的做法吗?

java - 如何避免重复捕获模拟方法的异常,这些异常可能会根据接口(interface)抛出异常

javascript - 如何调试鼠标移动

javascript - 我已经完成了 AngularJS 代码,但数据没有显示

javascript - Api 在 postman 中通过,但在 mocha js 中失败

组件级别的 Angular 模拟服务