Intento simular la función de carga de s3 con esta instrucción, pero cuando uso este patrón tengo un
TypeError: s3.upload no es una función
// upload.test.js const AWS = require('aws-sdk'); jest.mock('aws-sdk', () => { const mS3 = { upload: jest.fn().mockReturnThis(), promise: jest.fn() }; return { S3: jest.fn(() => mS3) }; }); const s3 = new AWS.S3(); s3.upload({}).promise.mockResolvedValueOnce({ Bucket: 'XXX' });Estoy usando también SQS y con este patrón tengo otro error:
AWS.SQS no es un constructor
¿Cómo puedo manejarlo?
// upload.js const AWS = require('aws-sdk'); const s3 = new AWS.S3(); s3Params = { Bucket: S3_BUCKET, Key: `example.xml`, ACL: 'public-read', ContentType: 'application/json', Body: Buffer.from(file) } } await s3.upload(s3Params).promise();En lugar de aws-sdk intente usar aws-sdk/clients/s3 .
cuando usa Jest .mockReturnValueOnce , debe ejecutar el simulacro DESPUÉS de que se establezca ese valor para poder recibir el valor que definió en mockReturnValueOnce como respuesta,
por ejemplo, burlándose de S3:
// s3-mock.test.js let AWS = require('aws-sdk'); jest.mock('aws-sdk', () => { let instance = { upload: jest.fn().mockReturnThis(), promise: jest.fn(), }; return { S3: jest.fn(() => instance) }; }); describe("setup for s3.upload testing", () => { let testS3; beforeEach(() => { testS3 = new AWS.S3(); testS3.promise.mockReturnValueOnce({ Bucket: 'TestBucketName' }); }) test('returns expected upload value', async () => { let params = {}; let result = await testS3.upload(params).promise(); expect(result).toEqual({ Bucket: 'TestBucketName' }); expect(result.Bucket).toBe("TestBucketName") }); });y burlándose de SQS:
// sqs-mock.test let AWS = require('aws-sdk'); jest.mock('aws-sdk', () => { let instance = { sendMessage: jest.fn().mockReturnThis(), promise: jest.fn(), }; return { SQS: jest.fn(() => instance) }; }); describe("setup for sqs.sendMessage testing", () => { let testSQS; beforeEach(() => { testSQS = new AWS.SQS(); testSQS.promise.mockReturnValueOnce({ MessageId: 'TestSQSId' }); }) test('returns expected message id', async () => { let params = {}; let result = await testSQS.sendMessage(params).promise(); expect(result).toEqual({ MessageId: 'TestSQSId' }); expect(result.MessageId).toBe("TestSQSId") }); });ejemplo de trabajo en https://github.com/oieduardorabelo/jest-mock-aws-sdk
como puede ver, son idénticos, también puede usar simulacros manuales en Jest con una carpeta __mocks__ con todos los paquetes que usted y para simular en sus pruebas, eche un vistazo a los documentos en: https://jestjs.io/docs/ simulacros manuales