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

尽管产生相同的快照,酶包装器仍然无法实现笑话平等

  •  1
  • Hristo  · 技术社区  · 6 年前

    下面是一个简单的React组件,带有一个默认值的可选道具:

    class Test extends Component {
      static defaultProps = {
        role: 'default'
      }
      render() {
        return (
          <div role={this.props.role}>
            { this.props.children }
          </div>
        );
      }
    }
    

    在测试中,我将安装这个组件两次,一次省略可选的prop,一次指定prop的默认值:

    import toJson from 'enzyme-to-json';
    import { mount } from 'enzyme';
    ...
    test('should render the same tree', () => {
    
      const a = mount(<Test />);
      const b = mount(<Test role="default" />);
    
      expect(toJson(a)).toMatchSnapshot();  // passes
      expect(toJson(b)).toMatchSnapshot();  // passes
      expect(toJson(a)).toEqual(toJson(b)); // fails
    });
    

    意外地, expect(toJson(a)).toEqual(toJson(b)); 正在失败。然而,Jest确认生成的树是相同的,因为它记录了 no visual difference 消息:

      ● should render the same tree
    
        expect(received).toEqual(expected)
    
        Expected value to equal:
          <Test role="default"><div role="default" /></Test>
        Received:
          <Test role="default"><div role="default" /></Test>
    
        Difference:
    
        Compared values have no visual difference.
    
          43 |       expect(toJson(a)).toMatchSnapshot();
          44 |       expect(toJson(b)).toMatchSnapshot();
        > 45 |       expect(toJson(a)).toEqual(toJson(b));
             |                         ^
          46 |     });
          47 | 
          48 | 
    

    此外,正如预期的那样,当省略可选属性以及为其提供默认值时,这将生成相同的快照:

    exports[`should render the same tree 1`] = `
    <Test
      role="default"
    >
      <div
        role="default"
      />
    </Test>
    `;
    
    exports[`should render the same tree 2`] = `
    <Test
      role="default"
    >
      <div
        role="default"
      />
    </Test>
    `;
    

    我正在努力弄清楚为什么这个测试用例失败了。

    • 我错过了什么?
    • 为什么尽管有重复的快照,这个相等性检查还是失败了?
    • 是否与 toJson 效用函数来自 enzyme-to-json ?
    • 可能与 enzyme 它自己?
    1 回复  |  直到 6 年前
        1
  •  1
  •   Brian Adams    6 年前

    中的helper函数 enzyme-to-json 被称为 toJson() 但这有点用词不当。它不返回JSON,而是返回一个非常复杂的对象 toMatchSnapshot() 然后转换为最终出现在快照文件中的JSON。

    两个对象在最高级别的简化视图返回 no visual difference 但如果你深入到 node 键您可以开始看到差异:

    expect(toJson(a).node).toEqual(toJson(b).node);