我如何使用 jest 来测试一个 React 组件,该组件导入一个组件,该组件导入 jQuery UI

How do I use jest to test a React component that imports a component that imports jQuery UI

我正在尝试使用 react-addons-test-utils 来浅渲染 React 组件 (ComponentA),以便我可以对其进行快照。

组件 A 导入组件 B。

组件 B 导入 'jquery' 和 'jquery-ui/ui/widgets/draggable',这会在 运行 Jest 下的测试时导致错误: jQuery is not defined

我尝试在 package.json 中使用 setupFiles 属性 来导入 jquery 和 jquery UI,但只取得了部分成功。我得到这个错误:Cannot read property 'mouse' of undefined

因为我只想要一个浅渲染,所以我真的不在乎组件 B 中有什么用于我的测试,所以我想我可以模拟 jquery 和 jquery UI.但是使用 jest.mock('jquery) 并不能修复 jQuery is not defined 错误。

那么,以上两种方法是否可行,或者我是否需要完全不同的路线?

示例代码:

ComponentA.tsx

import * as React from 'react';
import { AppState } from 'state/appState';
import { ComponentB } from 'components/b';

export class ComponentA extends React.Component<void, AppState> {
    public render(): JSX.Element {
        return (
            <div>
                <ComponentB/>
            </div>
        );
    }
}

ComponentB.tsx

import * as React from 'react';
import * as $ from 'jquery';
import 'jquery-ui/ui/widgets/draggable';

export class ComponentB extends React.Component<{}, {}> {
    // Lots of stuff with jQuery UI
}

Test.tsx

// Failed mocking of jquery
jest.mock('jquery');
jest.mock('jquery-ui/ui/widgets/draggable');

// Test file
import * as React from 'react';
import * as ReactTestUtils from 'react-addons-test-utils';
import { ComponentA } from 'components/a';

describe('ComponentA',
    () => {
        const shallowRenderer = ReactTestUtils.createRenderer();

        it('renders correctly',
            () => {
                // Act
                const tree = shallowRenderer.render(
                    <ComponentA/>
                );

                // Assert
                expect(tree).toMatchSnapshot();
            });
    });

设置文件内容失败

var $ = require('jquery');
global.$ = global.jQuery = $;
require('jquery-ui');

最简单的方法是像这样模拟 ComponentB

jest.mock('components/b', ()=> ({
  ComponentB: () => 'ComponentB'
}))

这将在您的快照中将 ComponentB 呈现为 <ComponentB/>。请注意,路径是相对于您的测试文件。