2017-10-14 193 views
1

在我的nodejs服務器中,我想嘲笑fs用於我的Mocha測試。 我最終使用嘲笑,但我真的誤解了一個概念。使用嘲諷模擬fs模塊

在我的測試(我用的打字稿以及):

// mock for fs 
var fsMock = { 
    readdir: (path: string) => { return { err: undefined, files: [] } }, 
    writeFile: (path: string, content: string, encoding: string) => { return { err: undefined } }, 
    readFileSync: (path: string, encoding: string) => { return "lol" } 
}; 
Mockery.registerMock('fs', fsMock); 


beforeEach((done) => { 
    Mockery.enable({ 
    useCleanCache: true, 
    warnOnReplace: false, 
    warnOnUnregistered: false 
    }); 
} 

afterEach(() => { 
Mockery.disable(); 
}); 
我的測試過程中

但不幸的是,我的模塊還用老FS。我明白爲什麼不工作。事實上,在我的測試中,我:

  • 導入我的模塊在文件
  • 的頂部,我導入模塊,我模塊將導入其依賴,爲FS。
  • 因爲在這個時候嘲諷尚未被啓用(我們仍然不運行測試...),我的模塊中導入的FS是我測試的
  • 我執行之前的原始一個
  • 我安裝我的嘲弄測試,那失敗,因爲仍然是原來的FS使用...

現在的問題是:我如何告訴我的模塊重新要求其依賴使用我的模擬版本的FS?而在全球範圍內,我如何輕鬆地嘲笑fs?

謝謝。

+0

訣竅是在設置模擬之後要求測試的模塊。 –

+0

另外,我認爲你必須首先啓用嘲笑,然後你註冊一個模擬 –

+0

我使用導入,這隻能用在文件的頂部:( – Adavo

回答

2

最後,經過測試和測試,我最終沒有使用mockery,而是使用SinonJS代替。它提供了一種非常容易和輕鬆的方式來模擬fs,例如, :

import * as Fs from "fs" 
import * as Sinon from "sinon" 

// .. 
// At a place inside a test where the mock is needed 
Sinon.stub(Fs, "readdir").callsFake(
    (path: string, callback: Function) => { callback(null, ['toto']) } 
);