【问题标题】:jest react-testing-library error symbol is not a function开玩笑反应测试库错误符号不是函数
【发布时间】:2021-10-22 23:14:22
【问题描述】:

大家好,我对简单测试有疑问,我尝试测试在链接标签中有文本,在导航中有链接标签,但我看到错误符号不是函数,你能帮帮我吗?

我的测试代码:

const mockUseLocationValue = {
    pathname: "",
    search: '',
    hash: '',
    state: null
}
jest.mock('react-router', () => ({
    ...jest.requireActual("react-router") as {},
    useLocation: jest.fn().mockImplementation(() => {
        return mockUseLocationValue;
    })
}));

test("should render the home page", () => {
    render(<Header />);
    const navbar = screen.getByTestId("navbar");
    const link = screen.getByTestId("home-link");
    expect(link.innerHTML).toMatch("Home page");
    expect(navbar).toContainElement(link);
});

我的原始代码:

export const Header = ():JSX.Element => {
    const location = useLocation()
    const { pathname } = location
    const splitLocation = pathname.split('/')
    return (
        <HeaderBlock as='h3' block>
            <nav data-testid="navbar">
                <ul className={styles.links}>
                    <li>
                        <Link data-testid="home-link" to="/">
                            Home Page
                        </Link>
                    </li>
                </ul>
            </nav>
        </HeaderBlock>
    )
}

【问题讨论】:

  • 你为什么要模拟你要测试的代码? RTL 测试功能可以采用wrapper 选项...您应该使用它来将正在测试的组件包装在路由器组件中。
  • @DrewReese 我开始学习测试而不进行模拟我看到错误位置未定义你能告诉我如何修复错误吗

标签: reactjs typescript jestjs react-testing-library


【解决方案1】:

使用react-testing-library 时,您可以为render 函数指定其他选项,其中之一是wrapper

wrapper

将 React 组件作为 wrapper 选项传递以使其呈现 围绕内部元素。这对于创建可重用的最有用 通用数据提供者的自定义渲染函数。

您不应该模拟您正在测试的功能。

创建一个内存路由器以进行测试。

import { MemoryRouter } from 'react-router-dom';

export const RouterWrapper = ({ children }) => (
  <MemoryRouter>{children}</MemoryRouter>
);

在测试中,导入包装器并传入选项。

import { RouterWrapper } from '../path/to/test/util';

test("should render the home page", () => {
  render(
    <Header />,
    {
      wrapper: RouterWrapper
    }
  );

  const navbar = screen.getByTestId("navbar");
  const link = screen.getByTestId("home-link");

  expect(link.innerHTML).toMatch("Home page");
  expect(navbar).toContainElement(link);
});

【讨论】:

  • 感谢帮助,但错误是相同的符号不是函数
  • @NikitaKagan 您能否将完整的错误消息添加到您的问题中,以及任何堆栈跟踪(如果可用)?
  • @NikitaKagan 我明白了。如果您注释掉查询和期望语句,那么您只是在运行渲染,您有问题吗?查询时是否出现问题?
  • 是渲染中的问题我注释了最后四行代码
  • @NikitaKagan 这是你完整的Header 组件代码吗?它似乎不完整,即 splitLocation 未使用。如果您注释掉 Header 中的所有 JSX 并仅渲染外部 HeaderBlock 组件并运行测试会发生什么?
猜你喜欢
  • 2023-02-09
  • 2020-08-24
  • 2017-01-25
  • 1970-01-01
  • 2017-02-11
  • 2020-03-02
  • 1970-01-01
  • 2021-06-25
  • 1970-01-01
相关资源
最近更新 更多