【发布时间】:2021-07-17 14:46:15
【问题描述】:
我正在使用 Jest 和 React 测试库为我的 React JS 应用程序编写单元测试。我正在尝试测试异步功能。但它不起作用。
这是我的测试
import React from 'react';
import "regenerator-runtime/runtime"
import {render, waitFor, fireEvent, screen} from '@testing-library/react';
import {DonorSelect} from "../../src/components";
import MockAdapter from "axios-mock-adapter";
import Axios from 'axios';
import vars from "../configVars";
import {searchUsersResponse} from "../mock/apiResponse";
import { act } from "react-dom/test-utils"
test ("DonorSelect Component", async () => {
let selectedUser = null;
let users = [ ];
let inputValue=""
//mock the users api endpoint
let mock = new MockAdapter(Axios);
mock.onGet(`${vars.baseApEndpoint}/users?keyword=client`)
.reply(200, searchUsersResponse)
await act(async() => await render(
<DonorSelect
id={"user_select"}
onSelect={(user, displayText) => {
selectedUser = { ...user }
}}
onInputChange={(textFieldValue) => {
inputValue = textFieldValue;
}}
onUsersFetched={(userItems) => {
users = [ ...userItems ]
}}
onChange={(name, value) => {
}}
label={"Search User"}
placeholder={"Please, select a user."}
name={"user"}
value={selectedUser!=null? selectedUser.id:""}
inputValue={inputValue}
/>
))
//assert that input is rendered
expect(screen.getByTestId("user_select_input")).toBeTruthy()
fireEvent.change(screen.getByTestId("user_select_input"), {
target: { value: "client" }
})
fireEvent.focus(screen.getByTestId("user_select_input"))
await waitFor(() => {
//assert that if the label is rendered
expect(screen.getByTestId("user_select_label")).toBeTruthy()
// assert that input is rendered
expect(screen.getByTestId("user_select_user_item_0")).toBeTruthy()
})
})
正如您在测试中看到的那样,最后一个 expect() 不起作用
expect(screen.getByTestId("user_select_user_item_0")).toBeTruthy()
总是失败。该组件所做的是,当输入值更改并专注于输入时,它将发出 api 请求并呈现项目。该组件按预期工作。我已经对其进行了全面测试。但它只是在测试中不起作用。我的代码有什么问题,我该如何解决?
【问题讨论】:
-
请提供stackoverflow.com/help/mcve。尚未确认该组件是否按预期工作。考虑到测试失败,很可能不会。
-
嗨,它按预期工作。我刚刚包含了组件的代码。请看一看。 @EstusFlask
-
组件体积大,故障点多,需要重构成几个。渲染函数是一种反模式,它可以是一个单独的组件。很难阅读,这减少了有人有足够的时间在 SO 上为您调试它的机会。据我所知,影响断言失败的兴趣点是
(props.inputValue =="" || users.length< 1)。可以看出您在测试中提供了 inputValue。但看起来用户是空的。您应该已经对user-autocomplete-users-wrapper进行了测试,以使测试更加具体。
标签: reactjs jestjs react-testing-library