用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实际上是正确的方法在这里。