使用嘲弄模拟fs模块

时间:2017-10-14 13:54:33

标签: node.js unit-testing mocking mocha fs

在我的nodejs服务器中,我想用Mocha模拟fs进行测试。 我最终使用了Mockery,但我真的误解了一个概念。

在我的测试中(我也使用Typescript):

// 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?

感谢。

1 个答案:

答案 0 :(得分:3)

最后,经过测试和测试,我最终没有使用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']) }
);