玩笑测试中的功能仅在单独启动时有效,但不能同时启动

Functions in a jest test only work when launched alone, but not at the same time

我有一个更新状态的自定义挂钩。由于 useImmer(),状态是用 immer 创建的。

我已经用 Jest 和“testing-library”编写了测试 - 它允许测试 hooks -。

单独启动时所有功能都可用。但是当我同时启动它们时,只有第一个成功。怎么会?

这是钩子:(为清楚起见进行了简化):

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([]);
  });
});

所有功能在现实生活中都有效。如何解决这个问题?谢谢!

使用 beforeEach 并重置所有模拟(函数具有陈旧的闭包数据)或制定通用逻辑以进行不同的测试并使用该逻辑来测试特定情况。

答案是:useHook 在“它”之前被调用。必须在下面调用。