node.js - 如何用 sinon 模拟事件?

标签 node.js unit-testing mocha.js sinon

这是我的简单程序,我尝试通过 ldapClient 获取用户数据。我需要在没有互联网连接的情况下测试它,所以想知道如何模拟 result.on 事件以返回适当的数据。

var request = require('request');
var ldap = require('ldapjs');

....
var ldapClient = ldap.createClient(ldapConfig);
....


var MY_CLASS = {
    getData: function (userId, cb) {
        if (!ldapConfig) {
            return cb(new Error('ldap is not configured'));
        }

        ldapClient.search('xxxx.com', { ldapConfig },
            function (err, result) {
                if (err) {
                    return cb(err);
                }

                result.on('searchEntry', function (entry) {
                    if (entry) {
                        return entry;
                    }
                });

                result.on('error', function (err) {
                    cb(err);
                });

                result.on('end', function () {
                    cb(null, 'END');
                });
            });
    }
};

module.exports = MY_CLASS;

正在寻找某些东西(见下文),但假设我需要使用 spy 。但是我如何在深层嵌套类中定义它?

before(()=>{
    sinon
    .stub(MY_CLASS.ldapClient, 'search')
    .yields(???);
});
after(()=>{
    MY_CLASS.ldapClient.search.restore();
});

最佳答案

如果您要对库进行 stub 处理,而不是从原始类文件中导出,则需要导入它,而不是将其作为类上的方法/属性引用

然后你会想要使用 callsArg from sinon调用回调

var ldapClient = ldap.createClient(ldapConfig);

...

var ldapStub;

before(()=>{
    ldapStub = sinon
        .stub(ldapClient, 'search')
        .callsArg(2);
});
after(()=>{
    ldapStub.restore();
});

然后,您可以在 stub 上包含断言(例如,ldapStub.usedOnce 应该为 true,等等)

关于node.js - 如何用 sinon 模拟事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57431644/

相关文章:

javascript - 可能的类似 Autoit 的 JavaScript 宏?

javascript - Mongoose Model.find() 方法在生产环境中损坏的问题

python - unittest 属性在 Python 中是否可变?

ruby - Sinatra 单元测试 - 使用 JSON 正文发布

javascript - 如何断言不为空?

node.js - 使用没有子域的 Nginx 设置多个 Node 服务器

angularjs - Protractor 中有 before() 函数吗?

unit-testing - 如何测试抽象数据类型?

javascript - mocha 运行测试两次

node.js - 没有注册的Sinon Spy已被调用(Async/Await)