在开玩笑中嘲笑global.window

时间:2018-02-08 17:39:18

标签: javascript reactjs jestjs

我有一个在节点和浏览器中运行的函数,我想用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

2 个答案:

答案 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
  });
});