检查子组件是否已渲染-笑话,酶

mav*_*ick 6 javascript reactjs jestjs enzyme

在单元测试中,我想测试父组件是否成功呈现了其子组件。这是代码:

describe('Parent Component', () => {
  it('renders Child component', () => {
    const wrapper = shallow(<Parent store={store} />);
    expect(wrapper.find(Child).length).toEqual(1);
  });
});
Run Code Online (Sandbox Code Playgroud)

上级:

const Parent = observer(({ store }) => {
  const bookList = toJS(store.planets);
  return (
    <div>
      <div className={style.planet_container}>
        {bookList.map(book => {
          return <Child key={book.name} name={book.name} />;
        })}
      </div>
    </div>
  );
});
Run Code Online (Sandbox Code Playgroud)

上面的代码是从这里获取的,但是它不起作用。我收到以下错误:

预期1,收到0'

我要去哪里错了?我在Jest 23.1.0中使用酶3.3。

小智 10

您可以使用containsMatchingElement().

基于酶文档

返回 patternNode 反应元素是否与渲染树中的任何元素匹配。

您的测试应如下所示:

describe('Parent Component', () => {
  it('renders Child component', () => {
    const wrapper = shallow(<Parent store={store} />);
    expect(wrapper.containsMatchingElement(<Child />)).toEqual(true);
  });
});
Run Code Online (Sandbox Code Playgroud)


vsy*_*ync 6

Enzyme允许通过组件的displayName进行查找:

来自酶 API 文档:

const wrapper = shallow(<MyComponent />);
expect(wrapper.find('Foo')).to.have.lengthOf(1);
Run Code Online (Sandbox Code Playgroud)

因此,为了测试确保子组件已呈现,您可以简单地通过其displayName引用它。

你可以打印包装器的 HTML 字符串console.log( wrapper.debug() )


如果您的组件是动态的,您可以将其 displayName 设置为固定的,这样测试会更加安全:

const MyComponent = props.dynamicChildComponent;
MyComponent.displayName = 'Foo';
Run Code Online (Sandbox Code Playgroud)

  • @CodeOfLife - 这里的讨论仅关于“笑话”+“酶”,对于您的问题,您需要检查是否有其他人已经问过这个问题,如果没有,请提出一个新问题。在别人的评论中提出新问题是不好的 (2认同)

Fel*_*rez 4

Child 没有渲染,因为您没有正确模拟道具(在本例中为道具“store”)。

尝试这个:

it('renders Child component', () => {
  const wrapper = shallow( < Parent / > );
  wrapper.setProps({
    store: {
      planets: [{
          name: "name 1"
        }
      ]
    }
  });
  expect(wrapper.find(Child)).toHaveLength(1);
});
Run Code Online (Sandbox Code Playgroud)