我使用Rewire package注入与单元测试相关的模拟。我希望能够在我的模块中测试私有函数:
var a = 10;
var b = 20;
function adder (){ //not exported
console.log(a);
console.log(b);
return a + b;
};
通过这样做:
var rewire = require('rewire'),
md = rewire('./module'),
mock = {a: 30, b: 40},
cb = md.__get__('adder');
console.log(md.__with__(mock)(cb));
将以下内容记录到控制台:
30
40
undefined
我觉得这很奇怪,因为30
和40
的记录似乎表明adder()
成功调用了mock
。
但为什么返回值undefined
不是70
?
答案 0 :(得分:1)
在我看来,由rewire返回的回调函数不会返回值,除非它是一个promise(在这种情况下它会返回promise)。
md.__with__(mock)
会返回一个需要回调的函数,因此可以将其简化为以下内容:function(callback){ callback(); }
并且因为__with__()
返回的函数没有返回回调的结果,所以最终在控制台日志中未定义。换句话说,您将记录模拟返回的函数的结果,而不是传递给模拟的回调的返回值。
编辑...试试这个作为证据:
md.__with__(mock)(function(){ console.log(cb());});
这里我们将记录cb(adder)返回值的值,而不是回调中未定义的返回值。
答案 1 :(得分:0)
因为回调的结果是promise
:
// https://github.com/jhnns/rewire/blob/master/lib/__with__.js#L29
returned = callback();
isPromise = returned && typeof returned.then === "function";
if (isPromise) {
returned.then(undo, undo);
return returned;
}