updateIn()调用的更新函数返回一个不可变的对象而不是值

时间:2018-11-22 18:25:17

标签: jestjs enzyme immutable.js react-boilerplate

我们有一个反应样板设置,它使用ImmutableJS,Jest和Enzyme作为其框架的一部分。

使用 ImmutableJS的 updateIn()测试reducer时,我们遇到了一个问题。

页面工作正常,但是我们无法对其进行测试,因为在reducer测试中,不可变的updater函数接收不可变的对象,但是我们希望可以使用普通的JS对象。

reducer.js:

calloc

=============

reducer.test.js:

case ACTION_TYPE: {

  const targetSectionId = action.sectionId;
  return state.updateIn(['allSections'], (allSections) =>

    allSections.map((section) => {

      // section is wrapped in immutable when testing
      // on regular execution, section.get() will fail
      // as it is plain javascript object
      const updatedSection = Object.assign({}, section);
      const sectionIdMatched = updatedSection.sectionId === targetSectionId;

      if (sectionIdMatched) {
        // on tests, does not get here
        // on regular execution, we get here
        updatedSection.commonSectionNames = action.commonSections;
        return updatedSection;
      }
      return updatedSection;
    })

  );

}

============

对此提出任何建议。

1 个答案:

答案 0 :(得分:1)

就是这样。不可变的更新程序函数将接收不可变的对象。如果您需要plainJS对象,请像这样使用toJS()

allSections.map((tempSection) => {
    const section = tempSection.toJS();
// perform operations with plainJS "section" here