gpt4 book ai didi

javascript - React/Jest setUp 测试以定义 windows 对象

转载 作者:行者123 更新时间:2023-12-05 00:32:25 29 4
gpt4 key购买 nike

我的测试中有一个错误,将窗口环境变量标记为未定义。我理解错误,因为它基于使用变量的应用程序的运行时,并且可能在运行应用程序时未定义它们。但我不知道在 setupTests.tsx 的哪个位置,我需要定义它。到目前为止,该变量是这样使用的:
index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<script src="%PUBLIC_URL%/config.js"></script>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>
config.js
window._env_ = {
REACT_APP_URL: "https://apiurl.com"
}
如何在应用程序中使用它:
declare const window: Window &
typeof globalThis & {
_env_: any
}

const url = window._env_.REACT_APP_URL;
export const apiUrl = url;
setupTests.tsx 我确实尝试在此处添加它,但它仍然无法正常工作
import '@testing-library/jest-dom';
import { setLogger } from 'react-query'
import { server } from './mocks/server'
declare const window: Window &

typeof globalThis & {
_env_: any
}

window._env_.REACT_APP_URL = "https://wwww.xxxxx.com"

beforeAll(() => server.listen())
// Reset any request handlers that we may add during the tests,
// so they don't affect other tests.


afterEach(() => server.resetHandlers())

// Clean up after the tests are finished.
afterAll(() => server.close())
停止测试的错误:
  ● Test suite failed to run

TypeError: Cannot read properties of undefined (reading 'REACT_APP_URL')

4 | }
5 |
> 6 | const url = window._env_.REACT_APP_URL;
| ^
7 | export const apiUrl = url;
8 |
9 |
at Object.<anonymous> (src/utils/Url.tsx:6:26)
at Object.<anonymous> (src/mocks/handlers.tsx:3:1)
at Object.<anonymous> (src/mocks/server.tsx:2:1)
at Object.<anonymous> (src/setupTests.tsx:7:1)

最佳答案

您看到错误的原因: jest新的 create-react-app 项目自动附带的库已经预先配置为使用 jsdom因为它是测试环境( ref ),这意味着 window属性将在测试运行时定义。但是,_env_不是 window 的默认属性变量,表示它是undefined并且尝试访问它的属性会给你一个错误。可以通过将新对象分配给 _env_ 来解决此问题。然而,还有另一个问题阻碍了我们的发展。以下作业const url = window._env_.REACT_APP_URL;将始终在您的测试执行之前进行评估。原因是当一个文件(在本例中为 setupTests.tsx 文件)导入另一个文件(例如 Url.tsx )时,导入文件的逻辑会立即被评估(几乎就像触发一个隐式调用的函数)以及其中的任何变量赋值它会立即执行,因此会覆盖 _env_测试中的属性将不起作用,因为为时已晚。
解决这个问题 :您可以模拟出包含变量的整个文件,并使用以下代码返回您需要的内容,该代码应放在测试文件的顶部:

jest.mock('./src/utils/Url', () => ({
get apiUrl () {
return "https://wwww.xxxxx.com";
}
}));

关于javascript - React/Jest setUp 测试以定义 windows 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72125285/

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