【问题标题】:React/enzyme: How to test for subcomponent?反应/酶:如何测试子组件?
【发布时间】:2018-01-17 19:12:45
【问题描述】:

这就是我的 Messenger 组件的样子。如您所见,有主组件和列表组件。主要组件默认导出。 有了这个,一切都在我的应用程序中按预期工作。

/imports/ui/components/messenger.jsx

import React, { Component } from 'react'
import PropTypes from 'prop-types'
import { Container, Segment, Loader, Header } from 'semantic-ui-react'

class Messenger extends Component {
  static get propTypes () {
    return {
      data: PropTypes.array,
      articleId: PropTypes.string,
      isLoading: PropTypes.bool
    }
  }

  render () {
    const { data, articleId, isLoading } = this.props

    if (isLoading) { return (<Loader active inverted size='massive' className='animated fadeIn' />) }
    if (articleId) { return (<MessengerList data={data} articleId={articleId} />) }

    return (
      <Container>
        <Segment id='' className='m-b-1'>
          <Header as='h1'>Title</Header>
          <MessengerList data={data} />
        </Segment>
      </Container>
    )
  }
}

class MessengerList extends Component {
  /* ... */
}

export default Messenger

现在我想使用酶对主要成分进行一些单元测试。我就是这样做的,但是最后一个测试失败了,因为MessengerList 没有定义。那么这应该怎么做呢。

import React from 'react'
import { expect } from 'meteor/practicalmeteor:chai'
import { shallow } from 'enzyme'

import { Container, Loader } from 'semantic-ui-react'
import Messenger from '/imports/ui/components/messenger.jsx'

describe('<Messenger />', () => {
  const defaultProps = {
    data: [],
    articleId: '',
    isLoading: true
  }

  it('should show <Loader /> while loading data', () => {
    const wrapper = shallow(<Messenger {...defaultProps} />);
    expect(wrapper.exists()).to.be.true
    expect(wrapper.find(Loader).length).to.equal(1)
  })
  it('should show <Container /> data has been loaded', () => {
    defaultProps.isLoading = false
    const wrapper = shallow(<Messenger {...defaultProps} />);
    expect(wrapper.find(Container).length).to.equal(1)
    expect(wrapper.find(Loader).exists()).to.be.false
  })
  it('should show <MessengerList /> if articleID is given', () => {
    defaultProps.articleID = 'dummy'
    defaultProps.isLoading = false
    const wrapper = shallow(<Messenger {...defaultProps} />);
    expect(wrapper.find(MessengerList).length).to.equal(1)
    expect(wrapper.find(Loader).exists()).to.be.false
  })
})

我不想改变export default Messenger

【问题讨论】:

  • 您必须在测试中导入MessengerList 组件。 import MessengerList from '../components/MessengerList.jsx; 然后expect(wrapper.find(MessengerList).length).to.equal(1);
  • 我无法导入它,因为它没有在 jsx 文件中导出。仅导出主要组件(默认)
  • 两个组件都在同一个文件中?
  • 是的,两个组件都在同一个文件中。与发布的完全相同。
  • 您是在测试&lt;Communicator/&gt; 还是&lt;Messenger /&gt;?因为在测试文件中你是浅渲染 .

标签: javascript reactjs unit-testing enzyme


【解决方案1】:

导出您的 MessengerList 类 ....

export class MessengerList extends Component {
  /* ... */
}

然后在测试中做......

import React from 'react'
import { expect } from 'meteor/practicalmeteor:chai'
import { shallow } from 'enzyme'

import { Container, Loader } from 'semantic-ui-react'
import Messenger, { MessengerList } from '/imports/ui/components/messenger.jsx';

describe('<Messenger />', () => {
  let wrapper;
  const defaultProps = {
    data: [],
    articleId: '',
    isLoading: true
  }

  beforeEach(() => {
    // render the component once up here in this block. It runs before each test.
    wrapper = shallow(<Messenger {...defaultProps} />);
  });

  it('should show <Loader /> while loading data', () => {
    expect(wrapper.exists()).to.be.true
    expect(wrapper.find(Loader).length).to.equal(1)
  });

  it('should show <Container /> data has been loaded', () => {
    defaultProps.isLoading = false

    expect(wrapper.find(Container).length).to.equal(1)
    expect(wrapper.find(Loader).exists()).to.be.false
  });

  it('should show <MessengerList /> if articleID is given', () => {
    defaultProps.articleID = 'dummy'
    defaultProps.isLoading = false

    expect(wrapper.find(MessengerList).length).to.equal(1);
    expect(wrapper.find(Loader).exists()).to.be.false
  });
});

更新

理想情况下,您应该首先声明正在修改道具...

...
describe('and the data has loaded', () => {
  beforeEach(() => {
    defaultProps.isLoading = false;
  });

  it('should show <Container /> component', () => {
    expect(wrapper.find(Container).length).to.equal(1)
    expect(wrapper.find(Loader).exists()).to.be.false
  });
});
...

【讨论】:

  • 不能将浅层放入beforeEach,因为每个测试的defaultProps 都不同。
猜你喜欢
  • 2017-08-16
  • 2019-01-30
  • 1970-01-01
  • 2020-06-01
  • 2017-07-03
  • 2017-05-20
  • 2018-01-30
  • 2017-09-24
  • 1970-01-01
相关资源
最近更新 更多