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\'', }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); });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); }); });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 ----------|---------|----------|---------|---------|-------------------