2016-11-23 50 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; 
}