Escribí un caso de prueba que cargó con éxito archivos en FS virtual y, al mismo tiempo, monté un volumen virtual como se muestra a continuación.
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 }); }); }); Mediante el uso de ufs.readdirSync , puedo acceder a FS virtual y, de hecho, darme como result archivos que se cargaron desde el disc en virtual FS , y result2 representa /app que es un nuevo volumen creado a partir de vol.fromJSON .
Ahora mi problema es que no puedo obtener el resultado de result3 , que está llamando al método countFile como se muestra a continuación
import fsPromises from "fs/promises"; export const countFile = async (path: string) => { const result = await fsPromises.readdir(path); return result.length; };estoy recibiendo un error
Error: ENOENT: no existe tal archivo o directorio, scandir '/app'
lo cual creo que es porque countFile está accediendo al FS real en lugar del virtual a pesar de que he tenido jest.mock('fs/promises') ?
Por favor, si alguien puede proporcionar alguna pista?
Esta es la función que desea probar unitariamente.
//CommonJS version const fsPromises = require('fs/promises'); const countFile = async (path) => { const result = await fsPromises.readdir(path); return result.length; }; module.exports = { countFile } Ahora, la forma en que normalmente haría esto es burlarse de fsPromises . En este ejemplo específicamente readdir() ya que esa es la función que se usa en countFile.
Esto es lo que llamamos: un trozo.
Una implementación esquelética o de propósito especial de un componente de software, que se utiliza para desarrollar o probar un componente que lo llama o depende de otro modo. Reemplaza un componente llamado.
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); })Haces esto porque estás realizando pruebas unitarias . No desea depender de otras funciones porque eso no es una prueba unitaria y más una prueba de integración. En segundo lugar, es una biblioteca de terceros, que es mantenida/probada por otra persona.
Aquí es donde se aplica su escenario. Desde mi perspectiva, su objetivo no es probar countFile() sino probar fsPromises y tal vez probar la funcionalidad para leer sistemas de archivos virtuales: unionfs . Si es así, no es necesario burlarse de fsPromises .