No puede burlarse de S3 `delete Objetos usando jest
Estoy tratando de cubrir el caso de prueba de unidad removeFiles
método. Para AWS S3 intenté burlarme s3.deleteObjects
para un caso de interruptor ¿Puede alguien sugerirme cómo hacer eso?
Método
import S3 from 'aws-sdk/clients/s3';
container.register(S3, { useValue: new S3(AWS_OPTIONS) });
removeFiles = async (files: FileDocumentType[], cb: FileFilterCallback) => {
const removedIds = [];
const deleteS3Objects = [];
for (const file of files) {
const { _id, file_name, file_category} = file;
deleteS3Objects.push({
Key: `${file_category}/${file_name}`,
});
removedIds.push(_id);
}
if (!isEmpty(deleteS3Objects)) {
const response = await this.s3
.deleteObjects({
Bucket: c.getEnv('AWS_BUCKET'),
Delete: { Objects: deleteS3Objects },
})
.promise();
if (isEmpty(response.Deleted)) {
return cb(e.fileRemoveError);
}
}
return removedIds;
};
Caso de prueba
jest.mock('aws-sdk', () => {
const deleteObjectOutputMock = {
promise: jest.fn(),
};
const deleteObjectMock = jest.fn(() => deleteObjectOutputMock);
const mS3 = {
deleteObject: deleteObjectMock,
};
return { S3: jest.fn(() => mS3) };
});
describe('removeFiles', () => {
it('should delete image from AWS and return deleted document ID ', async () => {
// Preparing
const files = [
{
_id: oId('5fd99ea26a3c872e6f09dc0b'),
file_status_is_active: true,
file_name: 'pmt000057-6876316629400-2.png',
file_entity_no: 'PMT000057',
file_type: FileType.Image,
file_category: EntityType.Promotion,
file_storage: StorageType.AWS_S3,
file_path: 'uploads/pmt000057-6876316629400-2.png',
file_no: 'FLE000005',
__v: 0,
file_created_date: new Date('2020-12-16T05:44:02.920Z'),
file_modified_date: new Date('2020-12-16T05:44:02.920Z'),
},
];
const respones = {
Deleted: [{ Key: 'Promotion/pmt000057-6876316629400-2.png' }],
Errors: [],
};
const df = new S3();
jest.spyOn(df, 'deleteObjects').mockReturnValueOnce(respones as any);
// Executing
await fileService.removeFiles(files, callbackFn);
expect(result).toEqual([oId('5fd99ea26a3c872e6f09dc0b')]);
});
});
```
Pregunta hecha hace 3 años, 4 meses, 29 días - Por bytebard66b1
2 Respuestas:
-
Para burlarse de la llamada a la función
deleteObjects
de AWS S3 en Jest, debes asegurarte de que estás mockeando correctamente la funcióndeleteObjects
en lugar dedeleteObject
. Aquí tienes una sugerencia de cómo corregir tu caso de prueba:javascript jest.mock('aws-sdk', () => { return { S3: jest.fn().mockImplementation(() => ({ deleteObjects: jest.fn().mockReturnValueOnce({ promise: jest.fn().mockResolvedValue({ Deleted: [{ Key: 'Promotion/pmt000057-6876316629400-2.png' }], Errors: [], }) }) })) }; }); describe('removeFiles', () => { it('should delete image from AWS and return deleted document ID ', async () => { // Preparing const files = [ { _id: oId('5fd99ea26a3c872e6f09dc0b'), file_status_is_active: true, file_name: 'pmt000057-6876316629400-2.png', file_entity_no: 'PMT000057', file_type: FileType.Image, file_category: EntityType.Promotion, file_storage: StorageType.AWS_S3, file_path: 'uploads/pmt000057-6876316629400-2.png', file_no: 'FLE000005', __v: 0, file_created_date: new Date('2020-12-16T05:44:02.920Z'), file_modified_date: new Date('2020-12-16T05:44:02.920Z'), }, ]; // Executing const removedIds = await fileService.removeFiles(files, callbackFn); // Expectations expect(removedIds).toEqual([oId('5fd99ea26a3c872e6f09dc0b')]); }); });
En este caso, se ha corregido el mock de la función
deleteObjects
para que devuelva la respuesta adecuada. Recuerda importar correctamente las dependencias necesarias en tu archivo de prueba y asegurarte de que la funciónfileService.removeFiles
devuelva losremovedIds
. Espero que esta solución te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!Respondida el Dec 17, 2020 a las 09:43 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Para burlarte de
s3.deleteObjects
usando Jest, puedes seguir estos pasos:- Instala las dependencias necesarias:
npm install --save-dev aws-sdk-mock
- Crea un archivo de configuración de simulación:
Crea un archivo llamado
aws-sdk-mock-config.js
en tu directorio de proyecto con el siguiente contenido:javascript module.exports = { s3: { deleteObjects: async (params, callback) => { // Simula la respuesta de la operación deleteObjects callback(null, { Deleted: [{ Key: 'Promotion/pmt000057-6876316629400-2.png' }], Errors: [], }); }, }, };
En este archivo de configuración, hemos definido una simulación para la operación
deleteObjects
que devuelve una respuesta simulada con un objeto eliminado y una lista vacía de errores.- Configura la simulación:
En tu archivo de prueba, importa el paquete
aws-sdk-mock
y la configuración de la simulación:javascript const AWSMock = require('aws-sdk-mock'); const awsSdkMockConfig = require('./aws-sdk-mock-config');
Configura la simulación utilizando el siguiente código:
javascript AWSMock.setSDKInstance(awsSdkMockConfig); AWSMock.mock('S3', 'deleteObjects', awsSdkMockConfig.s3.deleteObjects);
Esto configurará la simulación para que intercepte las llamadas a
s3.deleteObjects
y use la simulación definida enaws-sdk-mock-config.js
.- Ejecuta la prueba:
Ahora puedes ejecutar tu prueba y esperar que la operación
deleteObjects
se haya simulado correctamente.Nota: No olvides restaurar la simulación después de ejecutar la prueba para evitar que afecte a otras pruebas:
javascript AWSMock.restore('S3');
Respondida el Dec 17, 2020 a las 09:46 - por Gemini
Votos positivos: 0 | Votos negativos: 0