reactjs - 当我使用 react 测试库、react.lazy 和 suspense 两次开玩笑地运行相同的测试时,为什么加载程序没有显示在第二个测试中?
问题描述
这是我的代码示例
// App.js
import React, { Suspense, lazy } from "react";
const Loader = () => <div data-testid="loader">Loading...</div>
const Login = lazy(() => import("./Login"));
function App() {
return (
<Suspense fallback={<Loader />}>
<Login />
</Suspense>
);
}
export default App;
// Login.js
import React from 'react';
const Login = () => <div data-testid="login">Login</div>
export default Login
// App.test.js
import React from 'react';
import { render, waitForElementToBeRemoved, cleanup } from '@testing-library/react';
import App from './App';
describe('App when user is not signed in', () => {
it("should redirect to login page", async () => {
beforeEach(() => jest.resetAllMocks())
const { getByTestId, getByText } = render(<App />);
await waitForElementToBeRemoved(() => getByTestId('loader'))
const linkElement = getByText(/Login/i);
expect(linkElement).toBeInTheDocument();
});
})
describe('App with User Logged in as Admin', () => {
it("redirect to login page", async () => {
beforeEach(() => {
// will set local storage for auth token
// for a logged in user
})
let container = document.createElement('div')
const { getByTestId, getByText } = render(<App />, {
container
});
await waitForElementToBeRemoved(() => getByTestId('loader'))
const linkElement = getByText(/Login/i);
expect(linkElement).toBeInTheDocument();
});
})
我遇到的问题是,我希望在运行第二次测试时拥有加载器,但它不存在因此引发错误。
我想知道为什么加载器没有在第二个测试中呈现,它立即呈现登录页面。我怀疑第一个测试会影响第二个测试,但问题是为什么。
我在这里创建了一个对此问题的回复。https://repl.it/@tibetegya/Create-React-App
解决方案
toBeInTheDocument
断言该元素存在于文档中,顾名思义:
jest-dom 实用程序库提供 .toBeInTheDocument() 匹配器,可用于断言元素是否在文档正文中。这可能比断言查询结果为空更有意义。
该组件在第二次测试中被渲染为分离container
的元素,并且在文档 DOM 中不存在,因此测试失败。
相反,可以使用基本的 Jest 断言,如文档所示:
expect(linkElement).not.toBeNull()
可能没有理由使用自定义容器,除非需要测试组件在分离元素中的工作方式。
推荐阅读
- spring-data-elasticsearch - 如何在域类中给出索引别名而不是 Spring-dat-elasticsearch 中的索引名称
- json - JSON测试错误
- laravel - 您的要求无法解决为一组可安装的软件包。Laravel 5.6?
- asp.net-mvc - OAuth 2.0 和 Open ID Connect:无需专用链接/按钮即可集成多个 Open ID Connect 端点的标准方式
- python-3.x - MATLAB chi2ogf(x) 的 Python 等效项
- angular - Angular 5 / 6. 我在哪里放置我的登录页面?
- .net - REST api 在已安装的服务器上不起作用
- vba - 如何使我的代码在所有工作表中工作,而不仅仅是在当前活动工作表中?
- php - 当我在 laravel 的刀片中使用 foreach 时,last() 或 end() 不起作用
- php - PrestaShop ObjectModelCore::hydrateCollection()