【问题标题】:How to test button that on click renders html element within the same component in React testing library, Jest?如何测试单击时在 React 测试库 Jest 中的同一组件中呈现 html 元素的按钮?
【发布时间】:2022-02-10 16:11:02
【问题描述】:

我的 OrderModuleHeader 是一个可点击的 div,点击后会呈现 div,如下所示:

 const [orderModuleIsOpen, setOrderModuleIsOpen] = useState(true);

render (
<div>

     <OrderModuleHeader data-testid="orderModuleHeaderButton"
              onClick={() => setOrderModuleIsOpen(!orderModuleIsOpen)}
            >
              <NavigationArrow>
                <FontAwesomeIcon
                  icon={orderModuleIsOpen ? faChevronUp : faChevronDown}
                  className="fa-xs"
                />
              </NavigationArrow>
     </OrderModuleHeader>
            {orderModuleIsOpen && (
              <OrderModuleBody>Some content</OrderModuleBody>
)
 </div>)

所以div OrderModuleBody只有在我们点击按钮的时候才会显示出来。

我通过以下方式开始测试:

describe('Expand body button', () => {
it('should render OrderModuleBody when clicked', () => {
      const button = screen.getByTestId('orderModuleHeaderButton');
      
      fireEvent.change() ... 
    });
}

我意识到我让 div 可点击,在测试中我称之为按钮。

我不知道我到底需要在 fireEvent 中写什么来测试 OrderModuleBody (div) 是否在点击时呈现。

注意:我不允许从 Enzyme 引入浅层方法或使用除 Jest、React 测试库之外的任何其他测试框架。

感谢任何建议。

【问题讨论】:

    标签: reactjs unit-testing testing jestjs react-testing-library


    【解决方案1】:

    您需要渲染您的组件才能对其进行测试。然后您访问该按钮,然后模拟按钮单击,然后最终期望您的更改发生。

    测试库有一个名为userEvent的函数,可以模拟按钮点击。

    import { screen } from "@testing-library/react";
    import userEvent from "@testing-library/user-event";
    
    describe('Expand body button', async () => {
        it('should render OrderModuleBody when clicked', () => {
            // render your component
            render(<YourComponent />) 
            // access your button
            const button = screen.getByTestId('orderModuleHeaderButton') 
            // simulate button click
            userEvent.click(button); 
    
            // expect result
            await waitFor(() =>  
                expect(screen.getByText("Some content")).toBeInTheDocument();
           });
    }
    

    【讨论】:

    • 我说的是“一些内容”,抱歉没有澄清这一点。那里有一堆 HTML 元素,而不是字符串“某些上下文”。在这种情况下,我应该写什么而不是 queryByText?
    • queryByRole('div') 不起作用。错误'接收到的值必须是 HTMLElement 或 SVGElement。收到的值为:null'
    • 我的错我相信它:screen.getByText("Some content")
    • 您可以getByText() 基于您内容中的任何字符串。或者,将您的方法用于test-id 或任何您喜欢的方法。
    • 抛出错误的任何想法:“ TestingLibraryElementError: Unable to find an element by: [data-testid="unassigned-tab"]。忽略的节点:cmets, , ” 我已经导入了组件并将 data-testid="unassigned-tab" 添加到我的内容中的一个 div 中。我不明白为什么它看不到它?
    猜你喜欢
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 2021-08-17
    • 1970-01-01
    • 2018-04-17
    • 2020-02-06
    相关资源
    最近更新 更多