Có một số cách để chế nhạo các quả cầu trong Jest:
- Sử dụng
mockImplementation
phương pháp (hầu hết đùa như chiều), nhưng nó sẽ làm việc chỉ dành cho những biến trong đó có một số cài đặt mặc định được cung cấp bởi jsdom
, window.open
là một trong số họ:
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();
});
- Gán giá trị trực tiếp cho thuộc tính toàn cục, hầu hết đều thẳng về phía trước nhưng có thể kích hoạt thông báo lỗi cho một số
window
biến, ví dụ 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;
});
- Không sử dụng trực tiếp hình cầu (yêu cầu cấu trúc lại một chút)
Thay vì sử dụng trực tiếp giá trị toàn cục, có thể nhập nó từ một tệp khác sẽ gọn gàng hơn, vì vậy việc chế nhạo sẽ trở nên tầm thường với 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}`);
}
}