reactjs - 在单元测试中使用 getByRole 查找 Navlink

问题描述 投票:0回答:1

在我的 React 测试库单元测试中,我无法按角色获取 Navlink。

getByRole('link', { name: 'help' }) - This fails

导航链接没有文本,而是有一个帮助图标,这似乎是问题所在。

我收到的错误是:

TestingLibraryElementError: Unable to find an accessible element with the role "link" and name "help"

Here are the accessible roles:

link:

Name "Home":
<a
class="active"
href="home"
name="home"
/>

Name "About":
<a
class="inactive"
href="/about"
name="about"
/>

Name "":          <--- No name for link with icon
<a
class="inactive"
href="/help"
name="help"
/>

我的导航栏:

const NavBar = () => {

  return (
    <>
        <div className="navbar">
            <ul>
                <li>
                  <NavLink to="home" className={({isActive}) => (isActive ? 'active' : 'inactive')}>Home</NavLink>
                </li>
                <li>
                  <NavLink to="about" className={({isActive}) => (isActive ? 'active' : 'inactive')}>About</NavLink>
                </li>
                <li>
                    <NavLink to="help" name="help" className={({isActive}) => (isActive ? 'active' : 'inactive')}><FaQuestionCircle size='1.5rem' className="helpicon"/></NavLink>
                </li>
            </ul> 
        </div>
    </>
  );
};

export default NavBar;

失败的单元测试:

describe(Navbar, () => {

    const mockedNavigation = jest.fn();
    
    it('should navigate to help page', () => {
        
        const { getByRole } = render(<Navbar />, { wrapper: Router });
        fireEvent.click(getByRole('link', { name: 'help' }));

        expect(mockedNavigation).toHaveBeenCalledWith(
            "help", 
            {
                preventScrollReset: undefined,
                relative: undefined,
                replace: false,
                state: undefined,
                unstable_viewTransition: undefined
            });
    });
});

如何选择没有文本但使用图标的导航链接? 也许我可以使用 classNames ?添加额外的类以及活动/非活动? 另一种方法会更容易并且更具可读性。

感谢任何帮助,再次感谢!

reactjs jestjs react-router react-testing-library
1个回答
0
投票

链接角色在技术上应该有效,但如果您在定位某个组件时遇到困难,您还有其他一些选择。

  • 向元素添加

    data-testid
    属性并使用
    *byTestId
    查询。

    https://testing-library.com/docs/queries/bytesid

    const NavBar = () => {
      return (
        <div className="navbar">
          <ul>
            <li>
              <NavLink
                data-testid="link-home"
                to="home"
                className={({ isActive }) => (isActive ? 'active' : 'inactive')}
              >
                Home
              </NavLink>
            </li>
            <li>
              <NavLink
                data-testid="link-about"
                to="about"
                className={({ isActive }) => (isActive ? 'active' : 'inactive')}
              >
                About
              </NavLink>
            </li>
            <li>
              <NavLink
                data-testid="link-help"
                to="help"
                className={({ isActive }) => (isActive ? 'active' : 'inactive')}
              >
                <FaQuestionCircle size='1.5rem' className="helpicon" />
              </NavLink>
            </li>
          </ul> 
        </div>
      );
    };
    
    const { getByTestId } = render(<Navbar />, { wrapper: Router });
    fireEvent.click(getByTestId('link-help'));
    
  • 您也可以随时在渲染的 container 上使用

    querySelector

    https://testing-library.com/docs/queries/about#manual-queries

    const NavBar = () => {
      return (
        <div className="navbar">
          <ul>
            <li>
              <NavLink
                to="home"
                className={({ isActive }) => (isActive ? 'active' : 'inactive')}
              >
                Home
              </NavLink>
            </li>
            <li>
              <NavLink
                to="about"
                className={({ isActive }) => (isActive ? 'active' : 'inactive')}
              >
                About
              </NavLink>
            </li>
            <li>
              <NavLink
                to="help"
                className={({ isActive }) => (isActive ? 'active' : 'inactive')}
              >
                <FaQuestionCircle size='1.5rem' className="helpicon" />
              </NavLink>
            </li>
          </ul> 
        </div>
      );
    };
    

    类似于

    "a[href='/help']"
    "a[href='/help'].inactive"
    的查询:

    const { container } = render(<Navbar />, { wrapper: Router });
    fireEvent.click(container.querySelector("a[href='/help'].inactive"));
    

查看关于查询文档,根据实现或您在帖子中可能忽略的我们不知道的信息,您可能还可以使用其他选项。

© www.soinside.com 2019 - 2024. All rights reserved.