我编写了一个测试用例,成功将文件加载到虚拟 FS 中,同时挂载了一个虚拟卷,如下所示
describe("should work", () => {
const { vol } = require("memfs");
afterEach(() => vol.reset());
beforeEach(() => {
vol.mkdirSync(process.cwd(), { recursive: true });
jest.resetModules();
jest.resetAllMocks();
});
it("should be able to mock fs that being called in actual code", async () => {
jest.mock("fs", () => {
return ufs //
.use(jest.requireActual("fs"))
.use(createFsFromVolume(vol) as any);
});
jest.mock("fs/promises", () => {
return ufs //
.use(jest.requireActual("fs/promises"))
.use(createFsFromVolume(vol) as any);
});
const { createFsFromVolume } = require("memfs");
const { ufs } = require("unionfs");
const { countFile } = require("../src/ops/fs");
vol.fromJSON(
{
"./some/README.md": "1",
"./some/index.js": "2",
"./destination": null,
},
"/app"
);
const result = ufs.readdirSync(process.cwd());
const result2 = ufs.readdirSync("/app");
const result3 = await countFile("/app");
console.log({ result, result2, result3 });
});
});
通过使用ufs.readdirSync
,我可以访问虚拟 FS,并确实result
为我提供了从 加载的文件disc
,virtual FS
表示result2
这/app
是一个从创建的新卷vol.fromJSON
。
现在我的问题是我无法得到结果result3
,这是调用countFile
方法如下
import fsPromises from "fs/promises";
export const countFile = async (path: string) => {
const result = await fsPromises.readdir(path);
return result.length;
};
我收到错误
错误:ENOENT:没有这样的文件或目录,scandir '/app'
我认为这是因为countFile
尽管我已经访问了实际的 FS 而不是虚拟的jest.mock('fs/promises')
?
请问有人可以提供一些线索吗?