我正在尝试为将 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/