Jest.js 重置测试间可组合的全局状态

exdqitrt  于 2023-05-11  发布在  Jest
关注(0)|答案(1)|浏览(161)

我使用的是一个具有全局状态的组合

const state = ref([]);

export function useFoo() { 
  const loadFoos = async () => {
    const data = await fetch(...)
    state.value = await data.json();
  }

   return {
    state: readonly(state), //readonly!
    loadFoos
   }
}

现在我想用jest来测试这个组合。如果调用了正确的API,第一个测试用例应该是安全的。第二个测试用例(如果状态已填充数据)。然而,由于单例模式,第二个测试用例失败了。该状态仍然由第一个测试的testdata填充。

describe("useFoos", () => {
    const data = { data: "data" };
    beforeEach(() => {
      jest.resetModules();
      fetch.mockResolvedValue([data]);
    });

    it("calls api", async () => {
      const { state, loadFoos } = useFoos();
      await loadFoos();
      expect(fetch).toHaveBeenCalledTimes(1);
    });

    it("stores values", async () => {
      const { state, loadFoos } = useRoutes();
      // this fails because of the singleton pattern of the global state composable
      // state.value is not [], instead it its [data]
      expect(state.value).toEqual([]); 

      await loadFoos();
      expect(state.value).toEqual([data]);
    });
  });

我读过,我可以实现一个reset函数。但是我不想把它添加到我的生产代码中。我尝试的另一个选项是用jest.isolateModules为每个测试重新导入模块,但这也不起作用。
有人知道如何为每个测试重置state.value吗?

nukf8bse

nukf8bse1#

我想我已经使用jest.isolateModulesrequire而不是import做到了:

beforeEach(() => {
  jest.isolateModules(() => {
    myModule = require("./useFoo.");
  });
});

it("working test", () => {
  const { state } = myModule.useRoutes();
  expect(state.value).toEqual([]);
}

it("previously failed test", () => {
  const { state } = myModule.useRoutes();
  expect(state.value).toEqual([]); // this is now working 
}

这确保了在每次测试之前重新导入模块,从而再次初始化单例/状态。

相关问题