首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何与unionfs一起模拟fs模块?

如何与unionfs一起模拟fs模块?
EN

Stack Overflow用户
提问于 2022-01-27 10:01:37
回答 1查看 229关注 0票数 0

我编写了一个测试用例,它成功地将文件加载到虚拟FS中,同时还安装了一个虚拟卷,如下所示

代码语言:javascript
复制
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方法如下所示

代码语言:javascript
复制
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')

有人能提供线索吗?

EN

回答 1

Stack Overflow用户

发布于 2022-01-31 17:04:17

这是您想要进行单元测试的函数。

代码语言:javascript
复制
//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中使用的函数。

这就是我们所称的:存根。

一种软件组件的框架或特殊实现,用于开发或测试调用或依赖于它的组件。它取代了一个被调用的组件。

代码语言:javascript
复制
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就不需要真正被嘲笑了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70876621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档