我有一个触发router.push(‘/search’)的组件;
例:
const BottomNavigation = () => {
const router = useRouter();
return (
<div>
<button test-id="searchIcon" onClick={()=>{router.push('/search')}}>Go</button>
</div>
)
}
如何测试这个组件和router.push?
我试过这个,但不管用:
jest.mock('next/router', () => ({
__esModule: true,
useRouter: jest.fn()
}))
nextRouter.useRouter = jest.fn();
nextRouter.useRouter.mockImplementation(() => ({ route: '/search' }));
describe("The Bottom Navigation redirect to the page:", () => {
it('Search', () => {
const router = createMockRouter()
render(
<RouterContext.Provider value={router}>
<BottomNavigation />
</RouterContext.Provider>
);
const searchButton = screen.getByTestId('searchIcon');
fireEvent.click(searchButton);
expect(router.push).toHaveBeenCalledWith('/search')
})
})
错误:
预期:"/search“
电话数:0
我的createMockRouter是:
export function createMockRouter(router?: Partial<NextRouter>): NextRouter {
return {
basePath: '',
pathname: '/',
route: '/',
query: {},
asPath: '/',
back: jest.fn(),
beforePopState: jest.fn(),
prefetch: jest.fn(),
push: jest.fn(),
reload: jest.fn(),
replace: jest.fn(),
events: {
on: jest.fn(),
off: jest.fn(),
emit: jest.fn(),
},
isFallback: false,
isLocaleDomain: false,
isReady: true,
defaultLocale: 'en',
domainLocales: [],
isPreview: false,
...router,
};
}
路由器背景:
从‘next/dist/shared/lib/路由器-上下文’导入{RouterContext}
发布于 2022-01-14 03:55:37
我不认为您需要深深地嘲弄路由器,在我的例子中,它的工作方式如下所示:
import Router from 'next/router'
jest.mock('next/router')
describe('The Bottom Navigation redirect to the page:', () => {
let routerSpy
beforeEach(() => {
routerSpy = jest.spyOn(Router, 'push')
})
it('Search', () => {
...
expect(routerSpy).toBeCalledWith('/search')
})
}
您可以使用spyOn法
https://stackoverflow.com/questions/70687903
复制相似问题