Rewire:如何在不返回指定返回值的情况下执行此函数

时间:2016-11-23 04:21:12

标签: javascript node.js unit-testing eval

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

但为什么返回值undefined不是70

2 个答案:

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