มีสองวิธีในการล้อเลียนลูกโลกใน Jest:
- ใช้
mockImplementation
วิธีการ (ล้อเล่นมากที่สุดเช่นเดียว) แต่มันจะทำงานเฉพาะสำหรับตัวแปรเหล่านั้นซึ่งมีการดำเนินการเริ่มต้นบางอย่างให้โดยjsdom
, window.open
เป็นหนึ่งของพวกเขา
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();
});
- ค่ากำหนดโดยตรงไปยังสถานที่ให้บริการทั่วโลกส่วนใหญ่ตรงไปตรงมา แต่อาจก่อให้เกิดข้อผิดพลาดบางตัวแปรเช่น
window
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;
});
- อย่าใช้ลูกโลกโดยตรง (ต้องมีการปรับโครงสร้างเล็กน้อย)
แทนที่จะใช้ค่าส่วนกลางโดยตรงการอิมพอร์ตจากไฟล์อื่นอาจจะสะอาดกว่าดังนั้นการเยาะเย้ยจะกลายเป็นเรื่องเล็กน้อยกับ 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}`);
}
}