2017-10-14 191 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']) } 
);