Jest 测试文件中的模拟文档

Alb*_*ivé 2 javascript recaptcha reactjs jestjs

我在 React 组件中有这个方法,可以在 componentDidMount 时加载Google Recaptcha API

loadCaptcha = () => {
  ((d, s, id) => {
    const element = d.getElementsByTagName(s)[0];
    const fjs = element;
    let js = element;
    if (d.getElementById(id)) {
      return;
    }
    js = d.createElement(s);
    js.id = id;
    js.src = '//google.com/recaptcha/api.js';
    fjs.parentNode.insertBefore(js, fjs);
  })(document, 'script', 'google-recaptcha');
};
Run Code Online (Sandbox Code Playgroud)

document我在 Jest 测试文件中进行模拟时遇到问题,因为d只有.Document { location: [Getter/Setter] }undefined

我尝试添加setupFilesJest 配置,正如其他人在另一个问题中所说

"setupFiles": ["<rootDir>/__mocks__/documentMock.js"]

documentMock.js:

Object.defineProperty(document, 'currentScript', {
  value: document.createElement('script'),
});
Run Code Online (Sandbox Code Playgroud)

但没有运气。有人解决了吗?

还尝试过这个:

beforeAll(() => {
  global.document: { //code }
})
Run Code Online (Sandbox Code Playgroud)

Pd:这是错误:

TypeError: Cannot read property 'parentNode' of undefined
Run Code Online (Sandbox Code Playgroud)

谢谢。

jma*_*eli 5

无需在 Jest 中手动模拟 JSDOMtestEnvironment如果您选择默认内部jest.config.js文件,它将被自动模拟:

testEnvironment: "jest-environment-jsdom",
Run Code Online (Sandbox Code Playgroud)

如果你想使用 JSDOM 中未实现的一些 DOM 功能,只需按照官方文档模拟它们,例如

window.matchMedia = jest.fn().mockImplementation(query => {
  return {
    matches: false,
    media: query,
    onchange: null,
    addListener: jest.fn(),
    removeListener: jest.fn(),
  };
});
Run Code Online (Sandbox Code Playgroud)