gpt4 book ai didi

typescript - 引用错误 : Request is not defined when testing with React Router v6. 4

转载 作者:行者123 更新时间:2023-12-01 22:50:22 26 4
gpt4 key购买 nike

我正在尝试使用 React 测试库创建单元测试,该库单击 React Router 链接以验证某些页面是否出现。我使用的设置与找到的答案非常相似 here .当我运行测试时,我得到了 ReferenceError: Request is not defined。由于我使用的是 RouterProvider,因此我无法完全遵循 React 测试库文档。

我在专用文件中设置了路线:

export const routes: RouteObject[] = [{
path: '/',
element: <AppWrapper />,
errorElement: <PageNotFoundScreen />,
children: [{
path: '/',
element: <FeaturedSearchScreen />
},{
path: 'auth',
element: <AuthScreen />,
children: [{
path: 'login',
element: <LoginForm />
},{
path: 'signup',
element: <SignUpForm />
}]
},{
path: 'dashboard',
element: <DashboardScreen />
},{
path: 'search',
element: <SearchResultsScreen />,
loader: searchLoader
}
]
}];

然后我在我的测试文件中创建一个内存路由器

const router = createMemoryRouter(routes, {initialEntries: ['/']});
const user = userEvent.setup();
render(<RouterProvider router={router}/>);

我在 AppWrapper 中使用一个 Outlet 来渲染所有的 child 。

预计

测试通过

结果

Vitest caught 1 unhandled error during the test run.
This might cause false positive tests. Resolve unhandled errors to make sure your tests are not affected.

⎯⎯⎯⎯ Unhandled Rejection ⎯⎯⎯⎯⎯
ReferenceError: Request is not defined
❯ createRequest node_modules/@remix-run/router/router.ts:2654:3
❯ startNavigation node_modules/@remix-run/router/router.ts:886:19
❯ Object.navigate node_modules/@remix-run/router/router.ts:784:18
❯ push node_modules/react-router/lib/components.tsx:74:16
❯ navigate node_modules/react-router/lib/hooks.tsx:211:7
❯ internalOnClick node_modules/react-router-dom/index.tsx:727:9
❯ handleClick node_modules/react-router-dom/index.tsx:385:9
❯ HTMLUnknownElement.callCallback node_modules/react-dom/cjs/react-dom.development.js:4164:14
❯ HTMLUnknownElement.callTheUserObjectsOperation node_modules/jsdom/lib/jsdom/living/generated/EventListener.js:26:30
❯ innerInvokeEventListeners node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:350:25

当我渲染初始屏幕时,我能够验证所有组件,所以我知道我的设置通常是有效的。等待新页眉失败。请随意查看此分支上的完整代码 https://github.com/Thenlie/Streamability/tree/43-feat-test-suite

最佳答案

我最终需要创建一个定义 Request 的设置文件。我通过 React Router code 找到了这个

import { fetch, Request, Response } from "@remix-run/web-fetch";

if (!globalThis.fetch) {
// Built-in lib.dom.d.ts expects `fetch(Request | string, ...)` but the web
// fetch API allows a URL so @remix-run/web-fetch defines
// `fetch(string | URL | Request, ...)`
// @ts-expect-error
globalThis.fetch = fetch;
// Same as above, lib.dom.d.ts doesn't allow a URL to the Request constructor
// @ts-expect-error
globalThis.Request = Request;
// web-std/fetch Response does not currently implement Response.error()
// @ts-expect-error
globalThis.Response = Response;
}

这可以在测试配置文件中引用,对我来说 vitest.config.ts

import { defineConfig } from 'vitest/config';

// https://vitest.dev/guide/#configuring-vitest
export default defineConfig({
test: {
environment: 'jsdom',
setupFiles: './src/__tests__/setup.ts',
globals: true,
watch: false
}
});

关于typescript - 引用错误 : Request is not defined when testing with React Router v6. 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74497916/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com