代码之家  ›  专栏  ›  技术社区  ›  Leff

测试react组件的子级数

  •  0
  • Leff  · 技术社区  · 7 年前

    我第一次在React中编写了一个测试,我想知道是否有办法测试父组件中子组件的子组件数量,所以要清楚,这就是组件的外观,我已经将其缩减到与此问题相关的部分:

    <Modal>
         <RadioGroupField direction="vertical" name={`${fieldId}.resultat`} bredde="M">
              <RadioOption label={{ id: 'UttakInfoPanel.SykdomSkadenDokumentertAngiAvklartPeriode' }} value />
              <RadioOption label={{ id: 'UttakInfoPanel.SykdomSkadenIkkeDokumentert' }} value={false} />
         </RadioGroupField>
    </Modal>
    

    因此,当我为模态组件编写测试时,我想检查RadioGroupField组件的子组件数量是否正确:

    import React from 'react';
    import { expect } from 'chai';
    import { shallowWithIntl } from 'testHelpers/intl-enzyme-test-helper';
    
    import { Modal} from './Modal';
    
    const periode = {
      fom: '2018-01-01',
      tom: '2018-03-01',
    };
    it('should show modal component', () => {
        const wrapper = shallowWithIntl(<Modal
          fieldId="periode[0]"
          resultat={undefined}
          periode={periode}
        />);
    
        const radioGroupField = wrapper.find('RadioGroupField');
        expect(radioGroupField).to.have.length(1);
    
      });
    

    我如何编写该测试?

    使现代化

    我曾尝试在component和dive方法中使用name而不是string,但突然出现了一个错误:

    ReferenceError:未定义RadioGroupField

    这是我的测试:

    it('skal vise sykdom og skade periode', () => {
        const wrapper = shallowWithIntl(<Modal
          fieldId="periode[0]"
          resultat={undefined}
          periode={periode}
        />);
    
        const textAreaField = wrapper.find('TextAreaField');
        const undertekst = wrapper.find('Undertekst');
        const radioGroupField = wrapper.find('RadioGroupField');
        const fieldArray = wrapper.find('FieldArray');
        const hovedknapp = wrapper.find('Hovedknapp');
        const knapp = wrapper.find('Knapp');
        const radioGroupFieldComponent = wrapper.find(RadioGroupField).dive();
        expect(radioGroupFieldComponent.children()).to.have.length(2);
        expect(textAreaField).to.have.length(1);
        expect(undertekst).to.have.length(1);
        expect(radioGroupField).to.have.length(1);
        expect(fieldArray).to.have.length(1);
        expect(hovedknapp).to.have.length(1);
        expect(knapp).to.have.length(1);
      });
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   vapurrmaid    7 年前

    为了引用组件,请使用其名称,而不是文档中的字符串:

    wrapper.find(Foo) // Foo component, not 'Foo'
    

    我想检查RadioGroupField组件的子组件数量是否正确:

    使用 children() enzyme API

    const radioGroupField = wrapper.find(RadioGroupField).dive()
    expect(radioGroupField.children()).to.have.length(2)
    

    参考文献:

    编辑: 添加 dive() 因为这可能需要渲染组件(非DOM节点)

    使现代化

    我尝试过在组件和dive中使用name而不是string 方法,但我突然发现一个错误:

    ReferenceError: RadioGroupField is not defined

    测试中使用的任何组件都需要导入。

    下面是一个示例:

    富。js公司:

    import React from 'react'
    
    export const Bar = (props) => {
      return (
        <div>
          {props.children}
        </div>
      )
    }
    
    export const Baz = () => (
      <div>Foo</div>
    )
    
    export const Foo = () => (
      <Bar>
        <Baz />
        <Baz />
      </Bar>
    )
    
    export default Foo
    

    富。测验js公司

    import React from 'react'
    import { shallow } from 'enzyme'
    import Foo, { Bar, Baz } from './Foo'
    
    it('Foos', () => {
      let wrapper = shallow(<Foo />)
      expect(wrapper.find(Bar)).toHaveLength(1) // jest syntax
    })
    
        2
  •  0
  •   Roopak PutheVeettil    7 年前

    这也适用于:

    const radioOption = wrapper.find(RadioGroupField).dive().find(RadioOption);