2016-10-05 45 views
3

在javascript中(ES6),我有一個公用模塊,它只是包含了一些功能,然後在文件的結尾,我導出它們像這樣:如何興農間諜模塊輸出的實用功能

module.exports = { 
    someFunction1, 
    someFunction2, 
    someFunction3, 
} 

然後我想爲這些函數編寫單元測試。一些功能相互依賴;他們以某種方式互相呼叫,例如,某個功能1可能會調用某個功能2。沒有循環問題。

一切運作良好,直到我需要窺探其中一個函數被調用。我該怎麼做?目前我正在使用Chai和Sinon。

在測試文件,我已導入整個文件作爲一個模塊:

const wholeModule = require('path/to/the/js/file') 

最後,我的測試看起來如下:

it('should call the someFunction2', (done) => { 
    const spy = sinon.spy(wholeModule, 'someFunction2') 

    wholeModule.someFunction1() // someFunction2 is called inside someFunction1 

    assert(spy.calledOnce, 'someFunction2 should be called once') 
    done() 
}) 

的問題是,測試失敗,因爲在某些函數1中,someFunction2函數被直接使用。我將間諜應用到模塊對象的功能。但這是一個不同的對象。這裏的someFunction1的例子:

function someFunction1() { 
    someFunction2() 
    return 2; 
} 

我知道爲什麼它不會工作的原因,但我不知道什麼是在這種情況下,最好的做法,使其工作?請幫忙!

回答

3

您可以使用rewire模塊。這裏有一個例子:

的源代碼:

function someFunction1() { 
    console.log('someFunction1 called') 
    someFunction2(); 
} 

function someFunction2() { 
    console.log('someFunction2 called') 
} 

module.exports = { 
    someFunction1: someFunction1, 
    someFunction2: someFunction2 
} 

測試用例:

'use strict'; 

var expect = require('chai').expect; 
var rewire = require('rewire'); 
var sinon = require('sinon'); 

var funcs = rewire('../lib/someFunctions'); 

it('should call the someFunction2',() => { 
    var someFunction2Stub = sinon.stub(); 
    funcs.__set__({ 
    someFunction2: someFunction2Stub, 
    }); 

    someFunction2Stub.returns(null); 

    funcs.someFunction1(); 

    expect(someFunction2Stub.calledOnce).to.equal(true); 
}); 
+0

不錯的嘗試,但沒有工作= /。它清楚地稱爲假功能。但是當我斷言間諜被調用時,它不叫 –

+0

@ VilleMiekk-oja您是否在編輯後嘗試解決方案? –

+0

是的,結果沒有區別 –