我试图在jest中模拟useParams钩子,并试图使其动态化,这样我就可以模拟它几次。然而,如果我硬编码值,我只能模拟它。以下是我到目前为止得到的:
const mockedUsedNavigate = jest.fn();
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'), // use actual for all non-hook parts
useNavigate: () => mockedUsedNavigate,
useParams: () => ({
hash: '123',
}),
}));
字符串
这是可行的,因为我硬编码useParam返回一个{ hash: '123' }
对象。然而,如果我试图模拟它,它将不起作用:
const mockedUsedNavigate = jest.fn();
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'), // use actual for all non-hook parts
useNavigate: () => mockedUsedNavigate,
useParams: () => jest.fn().mockReturnValue({ hash: '123' })
}));
型
如果我这样做,我的组件将收到一个空值,并且该值不会以我想要的方式被模仿:
const { hash = '' } = useParams<{ hash: string }>();
console.log('hash: ', hash); ---> ''
型
所以我不知道我做错了什么...有人能给我指个方向吗?
1条答案
按热度按时间3lxsmp7m1#
useParams
通常返回基于当前路由的路由参数。因此,它不是一个可以使用jest.fn()
模仿的函数。useParams
钩子返回来自<Route path>
匹配的当前URL的动态参数的键/值对的对象。参见此处-> React Router docs当你使用
jest.fn().mockReturnValue({ hash: '123' })
时,它返回一个函数,而不是一个对象。因此,调用useParams<{ hash: string }>()
将导致一个空对象({})
。要使用特定值模拟
useParams
,您可以直接返回具有所需属性的对象。修改以下代码:字符串
这样,当组件调用
useParams<{ hash: string }>()
时,它将接收对象{ hash: '123' }
。不需要额外的jest.fn()
和mockReturnValue
。要在Jest中使用动态值模拟
useParams
,可以使用以下方法之一:型
或
型
这里
useParams
声明在describe()
之外,它的值在每个使用jest.spyOn
的单元测试中变化。或
型