Hay un par de formas de simular globales en Jest:
- Use el
mockImplementationenfoque (la mayoría de las formas de Jest), pero funcionará solo para aquellas variables que tienen alguna implementación predeterminada proporcionada por jsdom, window.openes una de ellas:
test('it works', () => {
const mockedOpen = jest.fn();
const originalWindow = { ...window };
const windowSpy = jest.spyOn(global, "window", "get");
windowSpy.mockImplementation(() => ({
...originalWindow,
open: mockedOpen
}));
statementService.openStatementsReport(111)
expect(mockedOpen).toBeCalled();
windowSpy.mockRestore();
});
- Asignar valor directamente a la propiedad global, la más sencilla, pero puede generar mensajes de error para algunas
windowvariables, por ejemplo window.href.
test('it works', () => {
const mockedOpen = jest.fn();
const originalOpen = window.open;
window.open = mockedOpen;
statementService.openStatementsReport(111)
expect(mockedOpen).toBeCalled();
window.open = originalOpen;
});
- No use globales directamente (requiere un poco de refactorización)
En lugar de usar el valor global directamente, podría ser más limpio importarlo desde otro archivo, por lo que burlarse se volverá trivial con Jest.
./test.js
jest.mock('./fileWithGlobalValueExported.js');
import { windowOpen } from './fileWithGlobalValueExported.js';
import { statementService } from './testedFile.js';
test('it works', () => {
statementService.openStatementsReport(111)
expect(windowOpen).toBeCalled();
});
./fileWithGlobalValueExported.js
export const windowOpen = window.open;
./testedFile.js
import { windowOpen } from './fileWithGlobalValueExported.js';
export const statementService = {
openStatementsReport(contactIds) {
windowOpen(`a_url_${contactIds}`);
}
}