javascript - Node : mocking a function with a callback argument

标签 javascript node.js unit-testing sinon

我正在尝试为将 jsonfile 读入对象的函数编写单元测试。我用

阅读文件
jsonfile.readFile(filename, function (err, obj) {
  //...
});

对于我的单元测试,我想模拟这个函数,这样它就不会实际读取文件,而是简单地返回一个固定的 json block 并将其传递到回调中。

我遇到的问题是如何模拟函数。我看过sinon ,它说它支持模拟函数,但我找不到任何描述如何为我正在模拟的函数实际定义自定义行为的内容。 Sinon 看起来允许我定义我希望函数返回的内容、我希望它被调用的频率等,但实际上并没有定义模拟函数。

基本上,我想要这样的东西:

mock(jsonfile, 'readFile', function(filename, callback) {
    callback(null, {attr1:"foo"});
});

如何使用 sinon 执行此操作?

最佳答案

但实际上,您为什么不将 readFile 替换为具有相同定义的函数(这样就不会破坏使用它的代码)。并返回您的模拟数据。

jsonfile.readFile = function(filePath, callback) {
    callback(null, { mockData: "foo" });
};

就这么简单。

否则,如果您不想处理定义,可以使用代理:

const jsonfile = {
    readFile: function(filename, callback) {
        callback();
    }
};

// intercept every call to readFile and always return the mock data
jsonfile.readFile = new Proxy(jsonfile.readFile, {
    apply: function(target, thisArg, args) {
        return args[1](null, { someMocking: "" });
    }
});

// call readFile as usual
jsonfile.readFile('testfile', function(err, result) {
    console.log(result);
});

代理充当拦截器。

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Proxy

关于javascript - Node : mocking a function with a callback argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46456338/

相关文章:

javascript - 超时不断变化的无限循环

javascript - 将键分配给 JSON 对象

javascript - 来自外部 js 文件的 XHR 导致应用程序崩溃

multithreading - 如何编写单元测试来检查方法是否线程安全

android - 如何编写单元测试用例 Volley API?

javascript - Node.JS MySQL 等待查询结果

javascript - 如何在ngtable中选择过滤器?

node.js - 如何将预编译的二进制文件与 Electron 捆绑在一起

javascript - 数组推送结果为空数组javascript

Angular Testing karma - 错误 : Can't resolve all parameters for RequestOptions: (?)