单元测试错误:字段必须在用 reduxForm() 装饰的组件内

Posted

技术标签:

【中文标题】单元测试错误:字段必须在用 reduxForm() 装饰的组件内【英文标题】:Unit test error: Field must be inside a component decorated with reduxForm() 【发布时间】:2019-09-26 09:47:21 【问题描述】:

我正在尝试测试我的容器,但在进行测试之前它做的第一件事就是这个错误:


      27 |   ;
      28 |
    > 29 |   const root = mount(
         |                ^
      30 |     <Provider store=store>
      31 |       <IntlProvider ...props>
      32 |         <ConfirmLeadContainer ...props />

但是,我的容器中有一个 redux 表单,我正在使用 recompose:

const enhance = compose(
  withAnalytics,
  withRouter,
  injectIntl,
  connect(null, mapDispatchToProps),
  flattenProp('params'),
  flattenProp('User'),
  withProps(createProps),
  withHandlers(handlers),
  reduxForm(
    form: 'confirmlead',
  ),
  lifecycle(
    componentDidMount() 
      const 
        cognitoId,
       = this.props;


        showExpiredLinkModal( cognitoId, event: 'accountStartAccountActivation' );

);

这是我的测试:

jest.mock('../../Analytics/track');
jest.mock('./ConfirmLead');
jest.mock('../updatePasswordWithCode');

const store = configureMockStore()(
  form: 'confirmLead',
);

const setup = (newProps) => 
  const props = 
    locale: 'en',
    router: 
      replace: jest.fn(),
    ,
    ...newProps,
  ;

  const root = mount(
    <Provider store=store>
      <IntlProvider ...props>
        <ConfirmLeadContainer ...props />
      </IntlProvider>
    </Provider>
    ,
  );

  const wrapper = root.find(ConfirmLead);

  return 
    root,
    wrapper,
    props,
  ;
;

describe('ConfirmLeadContainer', () => 
  beforeEach(() => 
    store.clearActions();
  );

  it('sets the firstName prop equal to firstName from match query params', () => 
    const  wrapper  = setup(
      match: 
        params: 
          cognitoId: '101101101',
          confirmationCode: '12121212',
          confirmationCodeExpiration: Date.now(),
        ,
        location: 
          query:  firstName: 'joseph' ,
        ,
      ,
    );

我不明白为什么或在哪里添加 redux 表单?以前没见过这个错误,而且这个错误对我没用...

任何想法我可以做些什么来摆脱错误?

【问题讨论】:

【参考方案1】:

我也面临同样的问题。

 Error: Field must be inside a component decorated with reduxForm()
        at new Field (webpack:///~/redux-form/lib/createField.js:77:0 <- karma.tests.js:80871:16)
        at webpack:///~/react-dom/lib/ReactCompositeComponent.js:292:0 <- karma.tests.js:25576:19
        at measureLifeCyclePerf (webpack:///~/react-dom/lib/ReactCompositeComponent.js:73:0 <- karma.tests.js:25357:13)
        at ReactCompositeComponentWrapper._constructComponentWithoutOwner (webpack:///~/react-dom/lib/ReactCompositeComponent.js:291:0 <- karma.tests.js:25575:17)
        at ReactCompositeComponentWrapper._constructComponent (webpack:///~/react-dom/lib/ReactCompositeComponent.js:282:0 <- karma.tests.js:25566:20)
        at ReactCompositeComponentWrapper.mountComponent (webpack:///~/react-dom/lib/ReactCompositeComponent.js:185:0 <- karma.tests.js:25469:22)
        at Object.mountComponent (webpack:///~/react-dom/lib/ReactReconciler.js:43:0 <- karma.tests.js:18057:36)
        at ReactDOMComponent.mountChildren (webpack:///~/react-dom/lib/ReactMultiChild.js:234:0 <- karma.tests.js:24689:45)
        at ReactDOMComponent._createInitialChildren (webpack:///~/react-dom/lib/ReactDOMComponent.js:701:0 <- karma.tests.js:21782:33)
        at ReactDOMComponent.mountComponent (webpack:///~/react-dom/lib/ReactDOMComponent.js:520:0 <- karma.tests.js:21601:13)

这里我们需要像下面这样应用reduxForm:

const AnyForm = () => 
     return (
       <form onSubmit=handleSubmit>
           <div>
             <label htmlFor="firstName">First Name</label>
             <Field name="firstName" component="input" type="text" />
           </div>
           <div>
             <label htmlFor="lastName">Last Name</label>
             <Field name="lastName" component="input" type="text" />
           </div> 
         <button type="submit">Submit</button>
       </form>
      )
 

AnyForm = reduxForm(
  form: 'formname'
)(AnyForm)

【讨论】:

请编辑您的问题,以便提问者更容易回答

以上是关于单元测试错误:字段必须在用 reduxForm() 装饰的组件内的主要内容,如果未能解决你的问题,请参考以下文章

使用酶测试ReduxForm

ReduxForm 装饰器,弹出 create-react-app 后出现 no-class-assign 错误

redux-saga 的单元测试抛出错误:必须在迭代器上调用 runSaga

再谈EF Core内存数据库单元测试问题

如何快速调试 sCrypt 单元测试错误

使用 jasmine 和 karma 进行单元测试时形成数组错误