Es gibt verschiedene Möglichkeiten, sich in Jest über Globals lustig zu machen:
- Verwenden Sie den
mockImplementation
Ansatz (meistens scherzhaft), aber er funktioniert nur für die Variablen, für die eine Standardimplementierung bereitgestellt wird. jsdom
Dies window.open
ist eine davon:
test('it works', () => {
// setup
const mockedOpen = jest.fn();
// without making a copy you will have a circular dependency problem
const originalWindow = { ...window };
const windowSpy = jest.spyOn(global, "window", "get");
windowSpy.mockImplementation(() => ({
...originalWindow, // in case you need other window properties to be in place
open: mockedOpen
}));
// tests
statementService.openStatementsReport(111)
expect(mockedOpen).toBeCalled();
// cleanup
windowSpy.mockRestore();
});
- Weisen Sie der globalen Eigenschaft einen Wert zu, der am einfachsten ist, aber bei einigen
window
Variablen, z window.href
.
test('it works', () => {
// setup
const mockedOpen = jest.fn();
const originalOpen = window.open;
window.open = mockedOpen;
// tests
statementService.openStatementsReport(111)
expect(mockedOpen).toBeCalled();
// cleanup
window.open = originalOpen;
});
- Verwenden Sie Globals nicht direkt (erfordert ein wenig Refactoring)
Anstatt den globalen Wert direkt zu verwenden, ist es möglicherweise sauberer, ihn aus einer anderen Datei zu importieren, sodass das Verspotten mit Jest trivial wird.
./test.js
jest.mock('./fileWithGlobalValueExported.js');
import { windowOpen } from './fileWithGlobalValueExported.js';
import { statementService } from './testedFile.js';
// tests
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}`);
}
}