tengo este objeto:
import keys from './keys' const obj = { getData: async funcion(url) { const key = await keys.getAccess() return get(url, { secret: key } }) } } Quiero simular la variable key con un valor simulado. Lo intenté:
test('test', async() => { const spyD = jest.spyOn(obj, 'getData'); expect(obj.getData).toHaveBeenCalledWith('/url', {secret: 'my mocked key') //but secret is undefined }) ... pero no puedo burlarme de la variable key . ¿Cómo burlarse de esa variable de mi función?
No puedes directamente; el alcance está cerrado, no hay forma de obtener acceso a una variable declarada dentro de él. Puede pasar la función que crea la key en su lugar para que pueda simular su implementación, mientras pasa la función original como predeterminada:
const obj = { getData: async function(url, getAccess = keys.getAccess) { const key = await getAccess() return get(url, { secret: key } }) } } test('test', async () => { const spyD = jest.spyOn(obj, 'getData'); const result = await obj.getData("/url", async () => "my mocked key"); expect(spyD).toHaveBeenCalledWith("/url"); }) Esta prueba ahora debería pasar, y el result será el valor de retorno de get llamado con "/url" y {secret: "my mocked key"} .
Alternativamente, si prefiere no modificar obj , puede simular la implementación de getData por completo para obtener el mismo resultado:
test('test', async () => { const spyD = jest.spyOn(obj, 'getData').mockImplementation(async (url) => { return get(url, {secret: "my-mocked-key"}) }); const result = await obj.getData("/url"); expect(spyD).toHaveBeenCalledWith("/url"); })