javascript - 如何在Nodejs中模拟外部依赖方法回调参数?

标签 javascript node.js unit-testing mocking

假设我有以下内容:

lib/modules/module1.js

var m2 = require('module2');

module.exports = function(){
    return {
        // ...
        get: function(cb){
            m2.someMethod(params, function(error, data){
                if(error){
                    cb(error)
                }

                cb(null, data)
            })
        },
        // ...
    }
}

现在假设我在另一个目录中有一组测试,例如测试/testModule1.js。从该文件中,我创建了一个 module1 实例来执行一些测试。

我想模拟从文件 testModule1.js 中由 m2.someMethod 传递到其回调函数(不是 cb 函数)的对象

我调查过Sinon.js ,但我想不出办法来做到这一点。事实上,我什至可能吗?

谢谢。

最佳答案

您可以使用诸如 proxyquire 之类的东西,但我不喜欢修改内置的 require

就我个人而言,我建议重写您的代码以使用依赖项注入(inject):

module.exports = function(m2){
    return {
        // ...
        get: function(cb){
            m2.someMethod(params, function(error, data){
                if(error){
                    cb(error)
                }

                cb(null, data)
            })
        },
        // ...
    }
}

请注意,我将 m2 移动为导出函数中的参数。然后在其他地方(应用程序,或主要,或其他),你可以这样做:

app.js

var module1Creator = require('module1');
var module2 = require('module2');
var module1 = module1Creator(module2);

然后当你需要测试它时......

testModule1.js

var module1Creator = require('module1');
// inject the "fake" version containing test data, spies, etc
var module2Mocked = require('module2mock');
var module1 = module1Creator(module2mocked);

关于javascript - 如何在Nodejs中模拟外部依赖方法回调参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39174974/

相关文章:

javascript - 如何将 ng-options 更改为 ng-repeat?

javascript - 超时调用时, Angular 双向绑定(bind)不起作用

node.js - MongoDB Promise 和结果处理

mysql - 在两个模型上使用 hasMany 处理 Sequelize Eager Load Error

javascript - promise reject not working with mysql 错误

java - JFC 单元测试教程/示例

javascript - 页面内容不会在 Internet Explorer 中刷新(仅在浏览器重新打开后)

objective-c - 我可以使用 OCMock 来测试父类(super class)是否被调用吗?

unit-testing - 如何在我的桌面上下载或保存 JMeter 结果?

javascript - 尝试从 C# 中的文本框获取文本值时出错(ASP.NET gridview)