【发布时间】:2022-01-18 02:28:06
【问题描述】:
我是反应测试的新手,从 youtube 的播放列表中学习。
在this very moment of the tutorial 中,讲师测试了一个组件,该组件:
- 具有使用效果。
- 在一个useEffect里面,有一个
axios.get - 状态随 api 响应更新。
- 状态数据转换为元素(每个元素都有
data-testid属性等于follower-item-{someNumber}。
测试的目的是找到一个数据元素。 .尽管我几乎要应付他的代码,但他的测试通过了,但我的没有。似乎测试在数据获取之前运行。
组件:
export default function FollowersList() {
const [followers, setFollowers] = useState([]);
useEffect(() => {
fetchFollowers();
}, []);
const fetchFollowers = async () => {
const { data } = await axios.get("https://randomuser.me/api/?results=5");
setFollowers(data.results);
};
return (
<div className="followerslist-container">
<div>
{followers.map((follower, ind) => (
<div className="follower-item" data-testid={`follower-item-${ind}`}>
<img src={follower.picture.large} />
<div className="followers-details">
<div className="follower-item-name">
<h4>{follower.name.first}</h4> <h4>{follower.name.last}</h4>
</div>
<p>{follower.login.username}</p>
</div>
</div>
))}
</div>
<div className="todo-footer">
<Link to="/">Go Back</Link>
</div>
</div>
);
}
测试:
const MockFollowersList = () => {
return (
<BrowserRouter>
<FollowersList />
</BrowserRouter>
);
};
describe("followers list", () => {
it("should render follower items", async () => {
render(<MockFollowersList />);
let el = await screen.findByTestId("follower-item-0");
expect(el).toBeInTheDocument();
});
});
结果:
Unable to find an element by: [data-testid="follower-item-0"]
<body>
<div>
<div
class="followerslist-container"
>
<div />
<div
class="todo-footer"
>
<a
href="/"
>
Go Back
</a>
</div>
</div>
</div>
</body>
【问题讨论】:
-
`await waitFor(() => {(getByTestId('follower-item-0')).toBeInTheDocument()})` 对你有用吗?
-
不幸的是没有成功。似乎测试在数据获取之前运行。
-
我认为你可以在第一次运行时给它一个 id 为 0 的假数组,以便在第一次运行时找到它,我的意思是不要用
EMPTY初始化数组,因为当它在第一次运行时搜索它找到的 IDundefined -
但在这种情况下,您不会真正准确地测试需要的情况,我的意思是在填充数据之前测试正在运行????
标签: reactjs jestjs react-testing-library