简体   繁体   English

反应组件测试。 摩卡咖啡,酶测试。 失误

[英]React components testing. Mocha, Enzyme tests. Errors

I am using Mocha and Enzyme tests. 我正在使用Mocha和Enzyme测试。 Write test in React app at first time. 第一次在React应用中编写测试。 Project is large, so I can't do this frm start. 项目很大,所以我无法开始此frm。 Tell me plz, do I need to add something in webpack.config file and what can I do with errors (below) "Cannot read property 'apply' of undefined" or "Cannot read 'type' of undefined" 告诉我,我需要在webpack.config文件中添加一些内容,以及如何处理错误(如下)“无法读取未定义的属性'应用'”或“无法读取未定义的'类型'”

在此处输入图片说明

Setup.js code: Setup.js代码:

 require('babel-register')(); var jsdom = require('jsdom').jsdom; var exposedProperties = ['window', 'navigator', 'document']; global.document = jsdom(''); global.window = document.defaultView; Object.keys(document.defaultView).forEach((property) => { if (typeof global[property] === 'undefined') { exposedProperties.push(property); global[property] = document.defaultView[property]; } }); global.navigator = { userAgent: 'node.js' }; documentRef = document; process.env.NODE_ENV = 'test'; function noop() { return null; } require.extensions['.css'] = noop; require.extensions['.scss'] = noop; require.extensions['.md'] = noop; require.extensions['.png'] = noop; require.extensions['.svg'] = noop; require.extensions['.jpg'] = noop; require.extensions['.jpeg'] = noop; require.extensions['.gif'] = noop; 

Test code: 测试代码:

 import React from 'react'; import { expect } from 'chai'; import { mount, shallow } from 'enzyme'; import configStore from 'redux-mock-store' import { defineMessages, FormattedMessage, injectIntl, intlShape } from 'react-intl'; import { LanguageSwitcher } from '../../src/components/LanguageSwitcher'; import { Header } from '../../src/components/Header'; import { SearchBoxRedirect } from '../../src/components/Header'; import { Link } from '../../src/components/Link'; import { Navigation } from '../../src/components/Navigation'; describe('<Header />', () => { const mockStore = configStore() it('must have an img', () => { const intlMockup = { formatMessage: () => ('') } const intlMockupDate = { formatDate: () => ('') } const intlMockupTime = { formatTime: () => ('') } const store = mockStore() const wrapper = mount(<Header intl={intlMockup, intlMockupDate, intlMockupTime} />); expect(wrapper.find('img')).to.have.length(1); }); }); 

Just in case, code of my simple component: 以防万一,我的简单组件的代码:

 import React from 'react'; import { defineMessages, FormattedMessage, injectIntl, intlShape } from 'react-intl'; import SearchBoxRedirect from './SearchBoxRedirect'; import withStyles from 'isomorphic-style-loader/lib/withStyles'; import s from './Header.css'; import Link from '../Link'; import Navigation from '../Navigation'; import LanguageSwitcher from '../LanguageSwitcher'; import logoUrl from './logo-small.png'; import logoUrl2x from './logo-small@2x1.png'; import alphaRibbon from './alpha-ribbon.png'; export class Header extends React.Component { static propTypes = { intl: intlShape.isRequired, }; componentDidMount() { this.searchbox.refs.queryField.focus(); } render() { return ( <div className={s.root}> <div className={s.container}> <img className={s.alphaRibbon} src={alphaRibbon} alt="alpha" width="50px" /> <Link className={s.brand} to="/"> <img src={logoUrl2x} srcSet={`${logoUrl2x} 2x`} width="67" height="38" alt="8kolo" /> <span className={s.brandTxt}> <FormattedMessage {...messages.brand} /> </span> </Link> <Navigation className={s.nav} /> <div className={s.search}> <SearchBoxRedirect ref={sb => { this.searchbox = sb; }} hitsRoute="/" searchOnChange placeholder={this.props.intl.formatMessage(messages.searchPlaceholder)} prefixQueryFields={['full_name']} /> </div> {/* <LanguageSwitcher /> */} </div> {/* <div className={s.banner}> <div className={s.container}> <FormattedMessage tagName="p" {...messages.bannerDesc} /> </div> </div>*/} </div> ); } } export default withStyles(s)(injectIntl(Header)); 

When I changed import Header from ../Header to 'import {Header} from ...' I get a new errors which on screen below 当我将import Header from ../Header更改为“从...导入{Header}”时,我收到了一个新错误,该错误显示在下面的屏幕上 在此处输入图片说明

I think the problem is that you are testing the HOC that requires the context from the parent component. 我认为问题在于您正在测试需要来自父组件上下文的HOC。

You can always export the pure component alongside the default wrapped component for testing. 您始终可以将纯组件与默认包装的组件一起导出以进行测试。

Component.js Component.js

export class Header extends React.Component {
  ...
}
export default withStyles(s)(injectIntl(Header));

Test code 测试码

import { Header } from '../../src/components/Header';
describe('<Header />', () => {
  it('must have an img', () => {
    const intlMockup = {
      formatMessage: () => (''),
      formatDate: () => (''),
      formatTime: () => (''),
    }
    const store = mockStore()
    const wrapper = mount(<Header intl={intlMockup} store={store} />);
    expect(wrapper.find('img')).to.have.length(1);
  });
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM