我一直在尝试的是使用shallow
渲染组件,这是由enzyme
提供的
。组件正在使用来自react-router-dom
的useHistory
。
const baseMatch: match<{ id: string }> = { /* path, url, params */};
const location = createLocation(baseMatch.url);
describe('MyComponent', () => {
const baseProps = {
history: createMemoryHistory(),
location: createLocation(baseMatch.url),
match: baseMatch
};
beforeEach(() => {
jest.mock('react-router-dom', () => ({
useHistory: jest.fn()
}));
});
afterEach(() => { jest.clearAllMocks() });
it('renders blah blah', () => {
const wrapper = shallow(<MyComponent {...baseProps} />);
// testing MyComponent here...
});
我参考了这篇文章,并以同样的方式jest.mock
。
但是,这会导致TypeError: Cannot read property 'history' of undefined
.
控制台说:
MyComponent › renders blah blah
TypeError: Cannot read property 'history' of undefined
24 | const MyComponent = (props: IProps) => {
25 | console.log('useHistory', useHistory);
> 26 | let history = useHistory();
奇怪的是,上面第 25 行中的console.log
打印了useHistory
的实现(换句话说,它不是未定义的(。
显然,useHistory
没有被嘲笑。 我怀疑useHistory
不能用shallow
来嘲笑(在上面的帖子中,海报使用了mount()
(。
但是,我不是 100% 确定,因为我无法从enzyme
和react-router
的文档中找到shallow
是否与useHistory
兼容。
是否可以将shallow
与useHistory
一起使用?任何建议将不胜感激。
从文档中:
注意:为了正确模拟,Jest 需要 jest.mock('moduleName'( 来 与 require/import 语句位于同一范围内。
因此,与其在beforeEach
中嘲笑 react-router-dom - 不如尝试将其放在顶部范围:
jest.mock('react-router-dom', () => ({
useHistory: jest.fn()
}));
const baseMatch: match<{ id: string }> = { /* path, url, params */};
const location = createLocation(baseMatch.url);
describe('MyComponent', () => {
const baseProps = {
history: createMemoryHistory(),
location: createLocation(baseMatch.url),
match: baseMatch
};
...