【发布时间】:2021-06-22 22:56:29
【问题描述】:
我正在使用 Recoil 进行状态管理,但在测试我的选择器时遇到问题。 似乎不可能在选择器中模拟一个函数。 我的代码类似于下面的代码:
const currentUserNameQuery = selector({
key: 'CurrentUserName',
get: async ({get}) => {
const response = await myDBQuery({
userID: get(currentUserIDState),
});
return response.name;
},
});
function CurrentUserInfo() {
const userName = useRecoilValue(currentUserNameQuery);
return <div>{userName}</div>;
}
现在,我想模拟 myDBQuery 的返回值,但在使用选择器时似乎无法做到这一点。我想知道是否有任何方法可以模拟选择器内函数的返回结果。
【问题讨论】:
-
为什么要测试这个选择器?这个测试能达到什么目的?选择器根据 id 返回一个 db 响应。如果您模拟响应,则您没有测试 id 的依赖关系,也没有测试查询功能。因此,您基本上是在测试选择器是否有效,这意味着您只是在测试反冲是否有效。
-
@JohannesKlauß,我有两个理由来测试它。第一个是测试覆盖率迫使我对其进行测试。如果不对其进行测试,我将无法通过 100% 的覆盖率。第二个原因,如您所见,选择器中的 get 是一个函数。通过测试这个函数的输出,我想确保将来没有人通过在 get 函数中添加一些东西来破坏结果。
-
100% 指的是数量,而不是质量。达到 100% 的测试覆盖率并没有说明测试的质量,也不应该被视为质量声明。和 tbh,这是一个完美的例子。如果你仍然模拟结果,你并不能确保没有人在 get 函数中添加任何东西。你永远无法确保这一点。你在这里做的是测试实现,但你应该测试行为。因此,您应该测试的是,如果选择器返回其他内容,则会显示什么。因此,您应该测试使用此选择器结果的钩子或组件。
标签: reactjs jestjs react-testing-library recoiljs