我编写了一个测试用例,它成功地将文件加载到虚拟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')
有人能提供线索吗?
发布于 2022-01-31 17:04:17
这是您想要进行单元测试的函数。
//CommonJS version
const fsPromises = require('fs/promises');
const countFile = async (path) => {
const result = await fsPromises.readdir(path);
return result.length;
};
module.exports = {
countFile
}现在,您通常的做法是模拟fsPromises。在本例中,特别是readdir(),因为这是在countFile中使用的函数。
这就是我们所称的:存根。
一种软件组件的框架或特殊实现,用于开发或测试调用或依赖于它的组件。它取代了一个被调用的组件。
const {countFile} = require('./index');
const {readdir} = require("fs/promises");
jest.mock('fs/promises');
beforeEach(() => {
readdir.mockReset();
});
it("When testing countFile, given string, then return files", async () => {
const path = "/path/to/dir";
// vvvvvvv STUB HERE
readdir.mockResolvedValueOnce(["src", "node_modules", "package-lock.json" ,"package.json"]);
const res = await countFile(path);
expect(res).toBe(4);
})这样做是因为您是单元测试。您不希望依赖于其他功能,因为这不是一个单元测试和更多的集成测试。其次,它是一个第三方库,由其他人维护/测试。
以下是适用于您的场景的地方。在我看来,您的目标不是测试countFile(),而是测试fsPromises和(可能是)的测试功能,以读取虚拟文件系统:unionfs。如果是这样的话,fsPromises就不需要真正被嘲笑了。
https://stackoverflow.com/questions/70876621
复制相似问题