我有一个在节点和浏览器中运行的函数,我想用jest测试:
const myFn = () => {
if(typeof window !== 'object'){
return 1;
}
return 2;
}
如何将全局窗口对象设置为undefined,以测试节点分支,并返回1。
e.g。
test('myTest', ()=> {
global.window = undefined;
expect(myFn()).toEqual(1); // result: 2
});
我试过这里的建议但没有成功: Mocking globals in Jest
答案 0 :(得分:7)
您可以尝试使用自v20.0.0开始提供的@jest-environment
docblock来更改不同测试的环境。默认情况下,它使用jsdom
,但您可以将其更改为使用node
。以下是他们的文档摘录:
/**
* @jest-environment jsdom
*/
test('use jsdom in this test file', () => {
const element = document.createElement('div');
expect(element).not.toBeNull();
});
参考:https://facebook.github.io/jest/docs/en/configuration.html#testenvironment-string
答案 1 :(得分:1)
使用新版jsdom,您可以执行以下操作:
import { JSDOM } from 'jsdom';
let windowSpy: any;
beforeEach(() => {
windowSpy = jest.spyOn(global as any, 'window', 'get');
});
afterEach(() => {
windowSpy.mockRestore();
});
describe('', () => {
it ('', () => {
const { window } = new JSDOM();
windowSpy.mockImplementation(() => window);
// now you have `window` in test environment
});
});