Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

166
Views
¿Cómo burlarse del módulo fs junto con unionfs?

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?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

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 .

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!