确保为酶加载了DOM环境



在从命令行在 Jest 中测试 React 应用程序时使用 Enzyme 的 mount 函数时,我收到以下错误。它说没有加载 DOM 环境,我认为这意味着我需要设置 JSDOM。然而,JSDOM似乎附带了Jest,并根据Facebook的Jest文档进行了预配置。这是我的测试:

import React from 'react'
import MyComponent from '../src/components/MyComponent'
import { configure } from 'enzyme'
import Adapter from 'enzyme-adapter-react-16'
import { mount, shallow } from 'enzyme'
import { Menu, Dropdown, Modal } from 'semantic-ui-react'
import renderer from 'react-test-renderer';
configure({ adapter: new Adapter() })
test('it works', () => {
    const wrapper = mount(
        <MyComponent />
    )
    expect(wrapper.contains('foobar')).toEqual(true)
});

这是错误:

Enzyme's mount expects a DOM environment to be loaded, but found none
  at assertDomAvailable (node_modules/enzyme-adapter-utils/build/Utils.js:107:11)
  at ReactSixteenAdapter.createMountRenderer (node_modules/enzyme-adapter-react-16/build/ReactSixteenAdapter.js:203:52)
  at ReactSixteenAdapter.createRenderer (node_modules/enzyme-adapter-react-16/build/ReactSixteenAdapter.js:384:25)
  at new ReactWrapper (node_modules/enzyme/build/ReactWrapper.js:96:54)
  at mount (node_modules/enzyme/build/mount.js:19:10)
  at Object.<anonymous> (test/LinesheetModal.test.js:12:37)
      at new Promise (<anonymous>)

它似乎与酶-适配器-反应-16有关。知道可能出了什么问题吗?

看起来问题是JSDOM和Enzyme没有正确设置。将此文件作为预加载文件添加到 Jest 修复了它:

import Adapter from 'enzyme-adapter-react-16'
import { configure } from 'enzyme'
import jsdom from 'jsdom'
function setUpDomEnvironment() {
    const { JSDOM } = jsdom;
    const dom = new JSDOM('<!doctype html><html><body></body></html>', {url: 'http://localhost/'});
    const { window } = dom;
    global.window = window;
    global.document = window.document;
    global.navigator = {
        userAgent: 'node.js',
    };
    copyProps(window, global);
}
function copyProps(src, target) {
    const props = Object.getOwnPropertyNames(src)
        .filter(prop => typeof target[prop] === 'undefined')
        .map(prop => Object.getOwnPropertyDescriptor(src, prop));
    Object.defineProperties(target, props);
}
setUpDomEnvironment();
configure({ adapter: new Adapter() })

Jest 配置了开箱即用的 JSDom,您需要确保在配置中使用 testEnvironment: jsdom

将其

添加到您的开玩笑配置中:

{
  testEnvironment: 'jsdom',
  verbose: true,
  testURL: 'http://localhost/',
}

更新:我又一次遇到了这个 - 我在 describe() 函数上使用了 async 关键字

正如我在 https://github.com/airbnb/enzyme/issues/1558 上提到的,当我遇到这个问题时,这是由于比我应该更早地传递和执行done()

就我而言,我在测试中错过了以下导入:

import 'node_modules/jsdom-global/register'

最新更新