reactjs - 开玩笑测试中的功能仅在单独启动时有效,但不能同时启动
问题描述
我有一个更新状态的自定义钩子。由于 useImmer(),状态是由 immer 生成的。
我已经用 Jest 和“测试库”编写了测试——它允许测试钩子——。
单独启动时,所有功能均有效。但是当我同时启动它们时,只有第一个成功。怎么会这样?
这是钩子:(为清楚起见进行了简化):
export default function useSettingsModaleEditor(draftPage) {
const [settings, setSettings] = useImmer(draftPage);
const enablePeriodSelector = (enable: boolean) => {
return setSettings((draftSettings) => {
draftSettings.periodSelector = enable;
});
};
const enableDynamicFilter = (enable: boolean) => {
return setSettings((draftSettings) => {
draftSettings.filters.dynamic = enable;
});
};
const resetState = () => {
return setSettings((draftSettings) => {
draftSettings.filters.dynamic = draftPage.filters.dynamic;
draftSettings.periodSelector = draftPage.periodSelector;
draftSettings.filters.static = draftPage.filters.static;
});
};
return {
settings,
enablePeriodSelector,
enableDynamicFilter,
resetState,
};
}
和测试:
describe("enablePeriodSelector", () => {
const { result } = useHook(() => useSettingsModaleEditor(page));
it("switches period selector", () => {
act(() => result.current.enablePeriodSelector(true));
expect(result.current.settings.periodSelector).toBeTruthy();
act(() => result.current.enablePeriodSelector(false));
expect(result.current.settings.periodSelector).toBeFalsy();
});
});
describe("enableDynamicFilter", () => {
const { result } = useHook(() => useSettingsModaleEditor(page));
it("switches dynamic filter selector", () => {
act(() => result.current.enableDynamicFilter(true));
expect(result.current.settings.filters.dynamic).toBeTruthy();
act(() => result.current.enableDynamicFilter(false));
expect(result.current.settings.filters.dynamic).toBeFalsy();
});
});
describe("resetState", () => {
const { result } = useHook(() => useSettingsModaleEditor(page));
it("switches dynamic filter selector", () => {
act(() => result.current.enableDynamicFilter(true));
act(() => result.current.enablePeriodSelector(true));
act(() => result.current.addShortcut(Facet.Focuses));
act(() => result.current.resetState());
expect(result.current.settings.periodSelector).toBeFalsy();
expect(result.current.settings.filters.dynamic).toBeFalsy();
expect(result.current.settings.filters.static).toEqual([]);
});
});
所有功能在现实生活中都有效。如何解决这个问题?谢谢!
解决方案
答案是:useHook 在“它”之前被调用。它必须在下面调用。
推荐阅读
- ruby - 无法检查布尔值是否存在 Rails 5
- regex - 正则表达式用于放置在给定字符串之前或之后的数字
- c++ - 如何使用这个 is_class SFINAE?
- dialogflow-es - Dialogflow 意图生命周期最佳实践和性能
- swift - Swift:升级到 Xcode 10 后单元测试方向更改时超时
- windows - Sysprep 失败
- listview - xamarin 表单列表视图操作菜单
- mysql - 从不同行中的多个表中选择
- javascript - 为什么在使用 neo4j 和 sigma.js 时,在 neo4j 中返回边的查询不起作用?
- loops - Windbg - 可以用 .for、.do 或 .while 来模仿 !for_each_frame 吗?