问题标签 [react-hooks-testing-library]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
reactjs - 获取 Firebase 错误:使用带有 jest 的 React-hooks-testing-library 时没有创建 Firebase 应用程序“[DEFAULT]”
我在 React 中使用 Firebase 身份验证,并尝试使用react-hooks-testing-library
. 我编写的代码正在运行。但是当我尝试测试时,react-hooks-testing-library
我得到了这个错误:
FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created ,调用 Firebase App.initializeApp() (app/no-app)。
这是我的实际代码:
使用Auth.tsx
在这个钩子里面会有 3 个项目,其中user
, loginWithEmailPassword
,signUpWithEmailPassword
这是我的测试
使用Auth.test.tsx
因此,当我触发该loginWithEmailPassword(email,password)
功能时,它一直显示No Firebase App error
. 但是在我的项目中,我已经有了这个文件,它已经初始化了 Firebase 应用程序。
./initFirebase.tsx,这里已经初始化了应用程序,并调用了它index.tsx
所以错误只发生在测试中,所以我认为我应该模拟该initializeApp
函数并在测试中的某个地方调用它。但我不知道该怎么做。
我刚开始在testing
现场。请有经验的人帮忙。
这是问题:
我的代码和测试发生了什么导致错误发生?
我应该怎么做才能解决这个错误?
先感谢您。
reactjs - 如何模拟将具有 then 和 catch 块的函数?
我使用 Firebase 身份验证,我想使用 Jest 和 react-hooks-testing-library 测试该功能。
我有一个这样的功能:
该signInWithEmailPassword()
函数有一个then()
和catch()
块。
我用这段代码模拟了这个函数:
然后我用react-hooks-testing-library
这样的方法测试上面的函数:
然后我的测试因此错误而失败:
如果我删除then
块,测试通过。但是如果我使用调用then()
函数它会得到错误。我检查了我的模拟signInWithEmailAndPassword
返回Promise.resolve()
应该没问题,但它仍然有错误。
我是测试领域的新手。请有人对此提出一些建议并告诉我我的测试有什么问题?我完全不知道
在寻找这个答案之后,我试图像这样模拟它:
但仍然有同样的错误
destructuring - 解构需要waitFor
为什么解构需要waitFor?
所有测试都做同样的事情。在我使用 renderHook的'ok.test.ts'result.current[1]
文件中,我 用来设置状态并result.current[0]
获取状态的值,到目前为止一切顺利。
在'not-ok'测试中,我会解构 renderHook 的结果并且测试失败,因为状态值不正确。
在“resolved.test.ts”中使用 waitFor 进行解构测试时有效。我知道设置状态是异步的。我不明白为什么'ok.test.ts'在没有waitFor 和没有解构的情况下工作,但如果我进行解构,我需要waitFor。
react-native - 使用异步初始化和设置函数测试 React (native) 钩子
我有以下钩子,允许从AsyncStorage
.
我正在尝试测试以下两件事
- 挂钩值在 处初始化
null
,表示该值仍应从存储中检索,这发生在异步中。
为此,我进行了以下测试:
然而,这给了我一个错误
An update to TestComponent inside a test was not wrapped in act(...)
,指的setValue
是useEffect
“安装时”发生的错误。我知道更改状态应该包含在一个act
中,但是这在初始化钩子期间是异步发生的。处理此错误的正确方法是什么?
- 使用以下测试将状态乐观地设置为新值:
这现在给了我错误:
You called act(async () => ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);
。然而,我将已经包裹act
在一个await
. 那么这里发生了什么,我怎样才能摆脱这个错误?
PS。测试成功完成,但出现上述错误。
reactjs - 使用 SetTimeout 测试自定义钩子,使用 Jest 测试 useEffect
我正在尝试测试一个使用 useEffect 和 setTimeout 的相对简单的自定义钩子。但是,我的测试失败了,我无法弄清楚出了什么问题。
这是钩子本身(useTokenExpirationCheck.ts)
和我的测试文件:
我所知道的是 exp 变量没有传递给 useTokenExpirationCheck 函数(console.log 在函数内部显示 0,当它被执行时)。所以基本上,我什至没有接触到 useEffect 本身......有什么想法会出错吗?
reactjs - 何时使用 waitForNextUpdate 而不是 act + jest.advanceTimersByTime?
在advanced-hooks#async文档中有一个示例。
我对如何waitForNextUpdate
工作感到困惑。我做了两个测试用例来比较waitForNextUpdate
和act()
+ jest.advanceTimersByTime()
。
index.ts
:
index.test.ts
:
测试结果:
两个测试用例都通过了。我发现的唯一区别是,如果我增加setTimeout
to的延迟1000 * 10
,使用的测试用例waitForNextUpdate
将失败。
waitForNextUpdate
那么和 和act()
+有什么区别jest.advanceTimersByTime()
?什么样的场景我只能使用waitForNextupdate
而不是act()
+ jest.advanceTimersByTime()
?
包版本:
javascript - 基本笑话测试接收到`globalObj.setTimeout is not a function`错误
我正在尝试测试一个基本的 Axios 钩子并收到:
据我所知,预期的正在通过,但由于某种原因仍然出现此错误,导致测试失败。这是对下面的 package.json 做出本机反应。该钩子适用于我的应用程序,我假设它与测试库有关,但我不确定是什么。
我的 Axios 钩子:
我的测试:
reactjs - 包装 fetch 的自定义 Hook 的测试加载状态
问题
我创建了一个自定义的 React 钩子,其中包含fetch
一个AbortSignal
和一个 loading state
。(我完全了解我可以使用的大量库,但这是针对企业应用程序的,这是此用例的最佳方法。)
钩子按预期工作。它允许我在需要时调用包装的 fetch(甚至传递给React-Query
),我可以按需调用中止调用,并根据加载状态更新 UI。
我可以很容易地测试钩子的返回值、被包装的 fetch 的调用、中止信号的功能;但是,我在loading
仅使用 jest 测试状态时遇到了很大的麻烦,并且react-hooks-testing-library
. Component
如果可以避免,我不想为此测试创建一个。
我希望能够调用包装的 fetch,并将加载状态视为 true,然后在解析后,将加载状态视为 false。目前,加载状态始终返回为 false。
use-wrapped-fetch.ts
对于这个钩子的内部状态,我已经尝试过useRef
, useState
, useReducer
,并且我在测试任何一种方式时都遇到了同样的问题。我也useCallback
完全删除了相同的结果。
use-wrapped-fetch.spec.ts
测试用于msw
在服务工作者上启动模拟服务器。下面的测试在第一次期望时失败(返回false
而不是期望true
)。