Quiero crear una acción Github de JavaScript y usar Jest con fines de prueba. Según los documentos , comencé a analizar la entrada, dado el siguiente código de ejemplo
import { getInput } from '@actions/core'; const myActionInput = getInput('my-key', { required: true });Ejecutar este código durante el desarrollo genera el siguiente error
Entrada requerida y no suministrada: my-key
como se esperaba porque el código no se ejecuta dentro de un entorno de acción de Github. Pero, ¿es posible crear pruebas para eso? P.ej
describe('getMyKey', () => { it('throws if the input is not present.', () => { expect(() => getMyKey()).toThrow(); }); });¿Cómo puedo "falsificar"/simular un entorno de este tipo con un contexto para garantizar que mi código funcione como se esperaba?
Hay varios enfoques que puede tomar.
Las entradas se pasan a las acciones como variables de entorno con el prefijo INPUT_ y en mayúsculas. Sabiendo esto, puede configurar la variable de entorno respectiva antes de ejecutar la prueba.
En su caso, la entrada my-key debería estar presente como la variable de entorno denominada INPUT_MY-KEY .
Esto debería hacer que su código funcione:
describe('getMyKey', () => { it('throws if the input is not present.', () => { process.env['INPUT_MY-KEY'] = 'my-value'; expect(() => getMyKey()).toThrow(); }); }); Puede usar jest.mock o jest.spyOn y, por lo tanto, simular el comportamiento de getInput .
Documentos: simulacros de clase ES6
No me gusta establecer variables de entorno globales, porque una prueba puede afectar a otra según el orden en que se ejecutan.
Además, no me gusta burlarme usando jest.mock , porque se siente como mucha magia y por lo general paso demasiado tiempo haciendo que haga lo que quiero. Los problemas son difíciles de diagnosticar.
Lo que parece brindar todos los beneficios con un poco más de código es dividir la acción en una función que se puede llamar pasando los objetos "globales" como core .
// index.js import core from '@actions/core'; action(core); // action.js function action(core) { const myActionInput = core.getInput('my-key', { required: true }); }Esto le permite probar muy bien su acción así:
// action.js describe('getMyKey', () => { it('gets required key from input', () => { const core = { getInput: jest.fn().mockReturnValueOnce('my-value') }; action(core); expect(core.getInput).toHaveBeenCalledWith('my-key', { required: true }); }); }); Ahora podría decir que ya no estamos probando si la acción arroja un error si la entrada no está presente, pero también considere lo que realmente está probando allí: está probando si la acción central arroja un error si la entrada es perdido. En mi opinión, este no es su propio código y, por lo tanto, vale la pena probarlo. Todo lo que quiere asegurarse es que está llamando a la función getInput correctamente de acuerdo con el contrato (es decir, documentos).