我使用的是一个具有全局状态的组合
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
吗?
1条答案
按热度按时间nukf8bse1#
我想我已经使用
jest.isolateModules
和require
而不是import做到了:这确保了在每次测试之前重新导入模块,从而再次初始化单例/状态。