2016-11-23 33 views
0

执行我使用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 

我觉得这奇怪,因为3040的记录似乎表明adder()已成功调用与mock

但是为什么在70代替返回值undefined

回答

1

在我看来,除非它是一个承诺(在这种情况下,它返回的承诺)由联控返回的回调函数不返回值。

md.__with__(mock)返回一个函数,它接受一个回调,所以可以归结为这样的事:function(callback){ callback(); }

,并因为__with__()返回函数不返回回调的结果,你最终未定义在您的控制台日志中。换句话说,您记录了模拟返回的函数的结果,而不是传递给模拟的回调的返回值。

编辑尝试这种作为证明:

md.__with__(mock)(function(){ console.log(cb());}); 

在这里,我们会记录,而不是从回调未定义回报CB(加法)的返回值的值。

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; 
}