Tengo un archivo js donde leo algún valor y cargo los resultados en una variable. el beneficio que obtengo es que no tengo que leer el archivo cada vez que lo necesito. simplemente puedo importar el objeto y usarlo.
sin embargo, no sé cómo escribir una prueba unitaria para ello.
const fs = require('fs'); const read_file = (path) => { try { const data = fs.readFileSync(path, 'utf8'); return data; } catch (err) { console.error('Error in read_file', err); throw err; } }; const getSecret = secretName => { try { return read_file(`/etc/secrets/${secretName}.txt`); } catch (err){ throw err; } }; const secretConfig = { kafka_keystore_password: getSecret('kafka_keystore_password') }; module.exports = secretConfig;Yo uso broma para escribir casos de prueba.
He intentado algo como esto, pero aún así el objeto se resuelve como indefinido.
const secretConfig = require('./secret'); const fs = require('fs'); jest.mock('fs'); fs.readFileSync.mockReturnValue('randomPrivateKey'); describe('secret read files', () => { it('should read secret from file', async () => { const secretMessage = secretConfig.kafka_keystore_password; expect(secretMessage).toEqual('randomPrivateKey'); }) })archivos de lectura secreta › debe leer el secreto del archivo
expect(received).toEqual(expected) // deep equality Expected: "randomPrivateKey" Received: undefined 18 | const secretMessage = secretConfig.kafka_keystore_password; 19 | //expect(fs.readFileSync).toHaveBeenCalled(); > 20 | expect(secretMessage).toEqual('randomPrivateKey');
Su prueba es correcta. El problema es que necesita simular antes de require el módulo ./secret porque el método getSecret se ejecutará inmediatamente cuando se requiera el módulo. En este momento, a fs.readFileSync todavía no se le ha dado un valor simulado.
const fs = require('fs'); fs.readFileSync.mockReturnValue('randomPrivateKey'); const secretConfig = require('./secret'); jest.mock('fs'); describe('secret read files', () => { it('should read secret from file', async () => { const secretMessage = secretConfig.kafka_keystore_password; expect(secretMessage).toEqual('randomPrivateKey'); }); });resultado de la prueba:
> jest "-o" "--coverage" PASS examples/69283738/secret.test.js (7.265 s) secret read files ✓ should read secret from file (2 ms) -----------|---------|----------|---------|---------|------------------- File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s -----------|---------|----------|---------|---------|------------------- All files | 76.92 | 100 | 100 | 76.92 | secret.js | 76.92 | 100 | 100 | 76.92 | 8-9,17 -----------|---------|----------|---------|---------|------------------- Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 7.794 s