【问题标题】:How to test a child component from parent component in react如何在反应中从父组件测试子组件
【发布时间】:2021-09-03 15:00:09
【问题描述】:

我有一个如下所示的组件文件,我想编写一个单元测试,如果 subComponent 作为 Header
App.test.tsx 下的 Header 父组件的 prop 传递,子组件应该显示该测试。我知道我可以通过渲染 Header 组件并将 sub 作为 prop 来编写测试。但是如何通过渲染 App 组件来测试相同的功能呢?

// SubComponentButton.test.tsx
const sub = <button test-id="test-id">Mock Sub Component</button>;

render(<Header subComponent={sub} />
expect(screen.queryByRole('button', {name: /mock sub/i})).toHaveTextContenet('Mock Sub Component');

// App component
export default function App() {
    const subComponent: JSX.Element = useMemo(() => {
        return ( <SubComponentButton />);
    }, []);

     return (
       <div className="App">
       <Header
         subComponent={subComponent}
       />
       </div>
     );
}

【问题讨论】:

  • 你用什么来写你的其他单元测试?此信息可以提供更简洁的答案
  • 笑话和测试库

标签: javascript reactjs typescript unit-testing


【解决方案1】:

首先,您可以创建一个专门用于测试的文件,例如Header.spec.tsx,最好放在一个名为tests__tests__ 的文件夹中。之后您可以运行 jest 来测试您的组件,我认为 yarn testnpm test 应该可以工作。

这样试试:

describe("Header", () => {
  it("renders the subComponent when provided", () => {
    const sub = <button datatest-id="test-id">Mock Sub Component</button>;
    render(<Header subComponent={sub} />)
    
    expect(screen.getByTestId('test-id')).toBeInTheDocument();
  })
})

通过这种方式,您假设在 dom 中将显示作为 subComponent 传递的组件

要从 App 组件测试它,您可以执行以下操作:

App.tsx

export default function App() {
  const subComponent: JSX.Element = useMemo(() => {
    return ( <SubComponentButton />);
  }, []);

  return (
    <div className="App">
      <Header subComponent={subComponent} />
    </div>
  );
}

SubComponentButton.tsx

export default function SubComponentButton() {
  return (
    <button data-testid="sub-component-button">SubComponent</button>
  );
}

App.spec.tsx

describe("App", () => {
  it("renders the subComponent", () => {
    render(<App />)
    
    // You can test by id (as you can see the SubComponentButton contains a button with a test-id attribute)
    expect(screen.getByTestId('sub-component-button')).toBeInTheDocument();

    // You can test by role
    expect(screen.getByRole('button', { name: "SubComponent" })).toBeInTheDocument();
  })
})

【讨论】:

  • 是的,我确切地知道如何在Header.test.tsx 下进行测试,但我的问题是如何在App.test.tsx 下从父组件测试header 以测试子组件
  • 谢谢,可以知道如何验证SubComponent必须在Header div下吗?如果在 Header 组件下有类 div header
  • 我不明白你的意思@jacobcan118
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 2018-01-17
  • 2019-12-29
  • 1970-01-01
  • 2019-12-04
  • 2021-08-24
  • 2020-02-04
  • 1970-01-01
相关资源
最近更新 更多