开玩笑-测试会对多个HOC做出反应。材质IU,反应路由器,打字稿中的mobX

时间:2018-12-18 20:12:54

标签: reactjs typescript jestjs enzyme higher-order-components

我正在尝试为我拥有的项目编写单元测试。为了简化问题,我创建了一个小示例项目来显示问题。您可以从github上将其下拉:Github Sample

在浅渲染时,我得到的错误是:

  

TypeError:无法读取未定义的属性“ displayName”

  at createStoreInjector (node_modules/mobx-react/index.js:585:46)
  at node_modules/mobx-react/index.js:698:16
  at Object.<anonymous> (src/Home/Home.tsx:21:76)
  at Object.<anonymous> (src/Home/Home.test.tsx:17:189)

我遇到的问题是我需要对具有多个HOC的组件进行单元测试。 Material UI中有一种用于样式,一种用于react-router,两种用于mobX注入和观察器。您可以在/ src / Home文件Home.test.tsx中看到失败的测试。

我无法弄清楚如何通过这个组件进行测试。我也有添加到Home组件的问题。它还具有相同的多个HOC,因此也会失败。

必须有一种方法可以测试这些类型的组件,但是我似乎无法使其正常工作。任何帮助都会很棒!

对于那些不想拉项目的人,这里是被测组件和测试本身的摘要。

Home.tsx

import withStyles, { WithStyles } from '@material-ui/core/styles/withStyles';
import classNames from 'classnames';
import { inject, observer } from 'mobx-react';
import * as React from 'react';
import { RouteComponentProps, withRouter } from 'react-router-dom';
import logo from '../logo.svg';
import { HomeStore } from '../Stores/HomeStore';
import { styles } from './Home.Styles';

interface IProps extends RouteComponentProps<{}> {
    homeStore?: HomeStore;
}

export default withStyles(styles)(
    inject('homeStore')(
        withRouter(
            observer(
                class Home extends React.Component<
                IProps & RouteComponentProps<{}> & WithStyles<typeof styles>,
                {}
                > {
                public render() {
                    const { classes } = this.props;
                    return (
                        <div className={classes.app}>
                            <header className={classes.appHeader}>
                                <img src={logo} className={classNames(classes.appLogo, classes.spin)} alt='logo' />
                                <h1 className={classes.appTitle}>Welcome to React</h1>
                            </header>
                            <p className={classes.appIntro}>
                                To get started, edit <code>src/App.tsx</code> and save to reload.
                            </p>
                        </div>
                    );
                }
            }))));

Home.test.tsx

import { shallow, ShallowWrapper } from 'enzyme';
import * as React from 'react';
import { MemoryRouter } from 'react-router';
import { HomeStore } from '../Stores/HomeStore';
import Home from './Home';

jest.mock('react-router-dom');
jest.mock('./Home.styles');

const homeStore = {} as HomeStore;

const props = {
    homeStore: homeStore,
    history: {},
    location: {},
    match: {},
    staticContext: {}
};

describe('Order Tests', () => {
    let homeWrapper: ShallowWrapper;

    beforeEach(() => {
        homeWrapper = shallow(<MemoryRouter><Home {...props} /></MemoryRouter>).first().shallow().first().shallow();
    console.log(homeWrapper.debug());
    });

    it('passes a test', () => {
        expect(true).toBe(true);
    });
});

0 个答案:

没有答案