Hay un par de formas de simular globales en Jest:
- Use el
mockImplementation
enfoque (la mayoría de las formas de Jest), pero funcionará solo para aquellas variables que tienen alguna implementación predeterminada proporcionada por jsdom
, window.open
es 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
window
variables, 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}`);
}
}