Tengo problemas para burlar el módulo AWS Secrets Manager para las pruebas unitarias de broma... La parte en la que falla es .promise(). Cuando elimino eso, el código no funciona para el Secrets Manager real, así que creo que debe permanecer allí. ¿Cómo me burlo de la función getSecretData para que getSecretData.promise() funcione para el simulacro?
Aquí está el código SecretsManager.js:
import AWS from 'aws-sdk'; export class SecretsManager { constructor() { AWS.config.update({ region: 'us-east-1', }); this.secretsManager = new AWS.SecretsManager(); } async getSecretData(secretName) { try { const response = await this.secretsManager.getSecretValue({ SecretId: secretName, }).promise(); const secretString = response.SecretString; const parsedSecret = JSON.parse(secretString); return parsedSecret; } catch (e) { console.log('Failed to get data from AWS Secrets Manager.'); console.log(e); throw new Error('Unable to retrieve data.'); } } }Aquí está el código SecretsManager.test.js:
import { SecretsManager } from '../utils/SecretsManager'; jest.mock('aws-sdk', () => { return { config: { update(val) { }, }, SecretsManager: function () { return { async getSecretValue({ SecretId: secretName }) { return { promise: function () { return { UserName: 'test', Password: 'password', }; } }; } }; } } }); describe('SecretsManager.js', () => { describe('Given I have a valid secret name', () => { describe('When I send a request for test_creds', () => { it('Then the correct data is returned.', async () => { const mockReturnValue = { UserName: 'test', Password: 'password', }; const logger = getLogger(); const secretManager = new SecretsManager(); const result = await secretManager.getSecretData('test_creds'); expect(result).toEqual(mockReturnValue) }); }); describe('When I send a request without data', () => { it('Then an error is thrown.', async () => { const secretManager = new SecretsManager(); await expect(secretManager.getSecretData()).rejects.toThrow(); }); }); }); });Este es el error que me sale al ejecutar las pruebas:
this.secretsManager.getSecretValue(...).promise is not a function ¡Cualquier sugerencia o sugerencia es muy apreciada!
Gracias por mirar mi publicación.
Finalmente logré que funcionara... Me imagino que sucederá poco después de publicar la pregunta, pero en lugar de eliminar la publicación, compartiré cómo cambié el simulacro para que funcione en caso de que ayude a alguien más.
Nota: Este es solo el simulacro actualizado, las pruebas son las mismas que en la pregunta anterior.
// I added this because it's closer to how AWS returns data for real. const mockSecretData = { ARN: 'x', Name: 'test_creds', VersionId: 'x', SecretString: '{"UserName":"test","Password":"password"}', VersionStages: ['x'], CreatedDate: 'x' } jest.mock('aws-sdk', () => { return { config: { update(val) { }, }, SecretsManager: function () { return { getSecretValue: function ( { SecretId } ) { { // Adding function above to getSecretValue: is what made the original ".promise() is not a function" error go away. if (SecretId === 'test_creds') { return { promise: function () { return mockSecretData; } }; } else { throw new Error('mock error'); } } } }; } }});Me encontré con este problema también. Puede haber una forma más elegante de manejar esto que también permita un mayor control y afirmación, pero no he encontrado ninguna. Tenga en cuenta que la opción de prueba puede funcionar mejor con versiones más nuevas de Jest.
Personalmente resolví este problema haciendo uso de simulacros manuales y un archivo de simulacro personalizado para aws-sdk . En tu caso, sería algo como lo siguiente:
# app_root/__tests__/__mocks__/aws-sdk.js const exampleResponse = { ARN: 'x', Name: 'test_creds', VersionId: 'x', SecretString: '{"UserName":"test","Password":"password"}', VersionStages: ['x'], CreatedDate: 'x' }; const mockPromise = jest.fn().mockResolvedValue(exampleResponse); const getSecretValue = jest.fn().mockReturnValue({ promise: mockPromise }); function SecretsManager() { this.getSecretValue = getSecretValue }; const AWS = { SecretsManager }; module.exports = AWS;Luego en su archivo de prueba:
// ... imports jest.mock('aws-sdk'); // ... your testsEntonces, en pocas palabras:
__mocks__ .SecretsManager en el archivo simuladoSecretsManager devuelve una instancia con la función simulada getSecretValuegetSecretValue devuelve una promesa simuladaexampleResponseBada boom, bada bing. Puedes leer más aquí .