2015-10-22 60 views
4

我試圖在給定使用摩卡,柴和sinon的條件時調用某個特定的方法。下面是代碼:在module.exports方法上使用sinon進行方法調用的測試

function foo(in, opt) { 
    if(opt) { bar(); } 
    else { foobar(); } 
} 

function bar() {...} 
function foobar() {...} 

module.exports = { 
    foo: foo, 
    bar: bar, 
    foobar:foobar 
}; 

下面是在我的測試文件中的代碼:

var x = require('./foo'), 
    sinon = require('sinon'), 
    chai = require('chai'), 
    expect = chai.expect, 
    should = chai.should(), 
    assert = require('assert'); 

describe('test 1', function() { 

    it('should call bar', function() { 
     var spy = sinon. spy(x.bar); 
     x.foo('bla', true); 

     spy.called.should.be.true; 
    }); 
}); 

當我做的console.log上說,它不是用手動記錄甚至稱你的間諜在酒吧方法中,我能夠看到它被調用。關於我可能做錯了什麼或者如何去做的建議?

感謝

回答

7

你已經創建了一個spy,但測試代碼不使用它。與你的間諜取代原來的x.bar(不要忘記做清理!)

describe('test 1', function() { 

    before(() => { 

    let spy = sinon.spy(x.bar); 
    x.originalBar = x.bar; // save the original so that we can restore it later. 
    x.bar = spy; // this is where the magic happens! 
    }); 

    it('should call bar', function() { 
     x.foo('bla', true); 

     x.bar.called.should.be.true; // x.bar is the spy! 
    }); 

    after(() => { 
    x.bar = x.originalBar; // clean up! 
    }); 

}); 
+0

需要另一個修改,一個必須定義在module.exports所有的方法,並通過與模塊前綴使他們從那裏引用它們。出口。一旦完成,測試通過使用您顯示的方法。再次感謝! –

+0

嗨@ToniKostelac,一年後,我面臨同樣的問題。不幸的是,我沒有得到你的修改,使Madara的解決方案工作。這些方法已經定義在要測試的文件的module.exports中,它們是否也必須在其他地方定義?並且需要哪些參考?你能寫一個代碼示例來展示我嗎? – Noneu

+0

@Noneu對於遲到的回覆感到抱歉,我在這裏沒有上網了很長一段時間,但希望你已經設法弄清楚了這一點。基本上這與我在模塊中使用的任何「私有」方法有關。由於他們沒有在出口中定義,我不能對他們使用間諜。 –

相關問題