Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

137
Vistas
¿Cómo simular archivos de E/S en sinon?

Tengo una función que descomprime un archivo del directorio. esta funcionando bien

índice.js

 const unZip = async (zipFilePath, destDir) => { await util.promisify(fs.mkdir)(destDir); return new Promise((resolve, reject) => { fs.createReadStream(zipFilePath) .pipe(unzipper.Extract({ path: destDir })) .on("close", () => resolve(destDir)) .on("error", (err) => { console.log("Error inside unzip", err); reject(err); }); }); };

pero para la prueba unitaria estoy usando sinon y ava , donde no puedo pasar el caso de prueba aquí está el código

índice.prueba.js

 ava.beforeEach(() => { // mockFs({ // 'fakeDir/fakeFile': mockFs.load('test/helpers/file/testFile.txt'), // fakeFileContent: 'content here', // }); sinon.stub(mockFs, 'createReadStream').returns({ pipe: sinon.stub().returns({ on: sinon.stub().returns({ on: sinon.stub().returns(), }), }), }); }); ava.serial('unZip test', async (t) => { const unzip = proxyquire('../../../src/helpers/file/unZip', { fs: mockFs, util: {}, unzipper: { Extract: () => Buffer.from([8, 6, 7, 5, 3, 0, 9]) }, }); const result = await unzip('fakeFileContent', 'fakeFileContent'); t.is(result, true); });

me esta dando el error asi

 unZip test Rejected promise returned by test. Reason: Error { code: 'EEXIST', errno: -17, path: 'fakeFileContent', syscall: 'mkdir', message: 'EEXIST: file already exists, mkdir \'fakeFileContent\'', }
about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Prueba esto

índice.prueba.js

 const mockFs = { createReadStream: function () { return this; }, mkdir: function (p, cb) { cb(null, this); }, pipe: function () { return this; }, on: function (param, cb) { if (param === 'close') { return cb(); } if (param === 'error') { return this; } }, }; ava.serial('unZip success', async (t) => { const unzip = proxyquire('../../../src/helpers/file/unZip', { fs: mockFs, util: {}, unzipper: { Extract: () => Buffer.from([8, 6, 7, 5, 3, 0, 9]) }, }); const mockZipFilePath = '../file/testFile.txt'; const destinationFilePath = '../file'; const result = await unzip(mockZipFilePath, destinationFilePath); t.is(result, destinationFilePath); });
about 4 years ago · Juan Pablo Isaza Denunciar

0

Soy nuevo en ava, así que puede ser que esté mal.

 proxyquire('../../../src/helpers/file/unZip')// actual function file ava('69616649', () => { ava.afterEach(() => { sinon.restore(); }); ava.serial('should pass', async () => { sinon.stub(fs, 'mkdir').callsFake((path, callback) => { callback(); }); const rs = { pipe: sinon.stub().returnsThis(), on: sinon.stub().callsFake(function (event, callback) { if (event === 'close') { callback(); } }), }; sinon.stub(fs, 'createReadStream').returns(rs); sinon.stub(unzipper, 'Extract'); const actual = await unZip('fakeFileContent', 'fakeFileContent'); sinon.assert.match(actual, 'fakeFileContent'); sinon.assert.calledWithExactly( fs.mkdir, 'fakeFileContent', sinon.match.func ); sinon.assert.calledWithExactly(fs.createReadStream, 'fakeFileContent'); sinon.assert.calledWithExactly(unzipper.Extract, { path: 'fakeFileContent', }); sinon.assert.calledOnce(rs.pipe); sinon.assert.calledWithExactly(rs.on, 'close', sinon.match.func); }); });
about 4 years ago · Juan Pablo Isaza Denunciar

0

No necesita usar el paquete proxyquire , use sinon.stub(obj, 'method') para stub métodos de objeto. Puede agregar los métodos fs.mkdir , unzipper.Extract y fs.createReadStream .

util.promisify para convertir fs.mkdir en un formulario de promesa y lo llamas, pero aún se está llamando a la devolución de llamada, por lo que debes usar el método .callsFake() para simular la implementación de fs.mkdir y llamar a la devolución de llamada. manualmente en el caso de prueba.

El siguiente ejemplo usa mocha como marco de prueba, pero ava también debería estar bien.

index.js :

 const fs = require('fs'); const util = require('util'); const unzipper = require('unzipper'); const unZip = async (zipFilePath, destDir) => { await util.promisify(fs.mkdir)(destDir); return new Promise((resolve, reject) => { fs.createReadStream(zipFilePath) .pipe(unzipper.Extract({ path: destDir })) .on('close', () => resolve(destDir)) .on('error', (err) => { console.log('Error inside unzip', err); reject(err); }); }); }; module.exports = unZip;

index.test.js :

 const unZip = require('./'); const fs = require('fs'); const sinon = require('sinon'); const unzipper = require('unzipper'); describe('69616649', () => { afterEach(() => { sinon.restore(); }); it('should pass', async () => { sinon.stub(fs, 'mkdir').callsFake((path, callback) => { callback(); }); const rs = { pipe: sinon.stub().returnsThis(), on: sinon.stub().callsFake(function (event, callback) { if (event === 'close') { callback(); } }), }; sinon.stub(fs, 'createReadStream').returns(rs); sinon.stub(unzipper, 'Extract'); const actual = await unZip('fakeFileContent', 'fakeFileContent'); sinon.assert.match(actual, 'fakeFileContent'); sinon.assert.calledWithExactly(fs.mkdir, 'fakeFileContent', sinon.match.func); sinon.assert.calledWithExactly(fs.createReadStream, 'fakeFileContent'); sinon.assert.calledWithExactly(unzipper.Extract, { path: 'fakeFileContent' }); sinon.assert.calledOnce(rs.pipe); sinon.assert.calledWithExactly(rs.on, 'close', sinon.match.func); }); });

resultado de la prueba:

 69616649 ✓ should pass 1 passing (7ms) ----------|---------|----------|---------|---------|------------------- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s ----------|---------|----------|---------|---------|------------------- All files | 81.82 | 100 | 75 | 81.82 | index.js | 81.82 | 100 | 75 | 81.82 | 13-14 ----------|---------|----------|---------|---------|-------------------
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda