用Jesttesting文件系统?

我正在使用mock-fs来testing我编写的Webpack插件,它修改了我的文件系统上的一个文件。

这是testing:

 test('writes chunks to build/assets.json if no json file present', () => { mockFs({ [buildDir]: {}, }); const stats = new Stats({ assetsByChunkName: { main: 'main.somecrazyhash12341213445345.js', }, }); const compiler = new Compiler(stats); const plugin = new ChunksToJsonPlugin(config); expect(fs.existsSync(assetFilePath)).toBe(false); plugin.apply(compiler); compiler.execHandler(); expect(fs.existsSync(assetFilePath)).toBe(true); expect(fs.readFileSync(assetFilePath, 'utf-8')).toEqual( JSON.stringify({ main: 'main.somecrazyhash12341213445345.js', }) ); mockFs.restore(); }); 

它运行的很好,当我自己运行它,但是当我作为一个套件的一部分运行时,其他testing(不使用mock-fs )rest。

ss http://d.pr/i/z2ne+

我注意到mock-fs在堆栈跟踪中,这使我相信文件系统也在这些testing中被mock-fs (我不想)。

mock-fs指出:

mock-fs @ 4版本将包含重大更改。 而不是重写内置的fs模块的所有方法,现在库重写process.binding('fs') 。 此更改的目的是为了避免与覆盖fs方法的其他库(例如, graceful-fs )发生冲突,并且可以使用多个Node版本,而不必保留Node的fs模块的复制和稍微修改版本。

我不太了解process.binding是如何工作的,特别是它与Jest并行运行testing有关,但我觉得这是核心问题。

我怎样才能做这个工作? 有没有另一种方法来testing这种行为,而不使用mock-fs

好的,所以我可以用dependency injection(DI)工作,抛弃mock-fs来支持memfs

 import memfs from 'memfs'; // ... test('writes chunks to build/assets.json if no json file present', () => { // eslint-disable-next-line new-parens const fs = new memfs.Volume; fs.mountSync(buildDir, {}); // same as before const plugin = new ChunksToJsonPlugin(config, fs); // ------------------------------------------ ^^ expect(fs.existsSync(assetFilePath)).toBe(false); // same as before expect(fs.existsSync(assetFilePath)).toBe(true); expect(fs.readFileSync(assetFilePath, 'utf-8')).toEqual( JSON.stringify({ main: 'main.somecrazyhash12341213445345.js', }) ); }); 

相应地, ChunksToJsonPlugin API也必须改变,以便在运行时传入实际的fs模块:

 import fs from 'fs'; // ... new ChunksToJsonPlugin(config, fs) 

这工作,现在我的testing不关心并行/串行运行,但我觉得我可能会在这个过程中的一些NodeJS约定。 一般来说我在使用系统导入时没有看到太多的DI,所以我只是为了testing而担心使用这个模式。

仍然开放知道这是否是可能的mock-fs ,或者如果DI实际上是正确的方法在这里。