这些答案都不适合我,并进行了大量挖掘,所以我想我会在这里积累经验。
私有路由.js
export const PrivateRoute = ({ component: Component, ...rest }) => (
<Route {...rest} render={(props) => (
auth.isAuthenticated
? <Component {...props} />
: <Redirect to={{
pathname: '/',
state: { from: props.location }
}} />
)} />
)
PrivateRoute.spec.js
这个测试对我来说没有任何问题,它使PrivateComponent
whenauth.isAuthenticated
评估为真。
it('renders the component when the user is authorised', () => {
auth.login()
expect(auth.isAuthenticated).toBe(true)
const privateRoute = mount(
<MemoryRouter initialEntries={['/privateComponent']}>
<PrivateRoute path='/privateComponent' component={PrivateComponent} />
</MemoryRouter>
)
expect(privateRoute.find('PrivateComponent').length).toEqual(1)
})
这是给我带来很多问题的测试。起初我正在检查Redirect
组件。
我试着做类似的事情
expect(privateRoute.find('Redirect').length).toEqual(1)
但这不起作用,无论我做什么,它都找不到Redirect
组件。最后,我最终查看了历史记录,但在网上找不到任何可靠的文档,并最终查看了 React Router 代码库。
在MemoryRouter.js(第 30 行)中,我看到它呈现了一个Router
组件。我注意到它也将它history
作为props传递给,Router
所以我想我可以从那里抓住它。
我最终从Router
使用中获取了历史propsprivateRoute.find('Router').prop('history')
,然后最终给了我证据证明重定向确实发生了,到了正确的位置,不少于。
it('renders a redirect when the user is not authorised', () => {
auth.logout()
expect(auth.isAuthenticated).toBe(false)
const privateRoute = mount(
<MemoryRouter initialEntries={['/privateComponent']}>
<PrivateRoute path='/privateComponent' component={PrivateComponent} />
</MemoryRouter>
)
expect(privateRoute.find('PrivateComponent').length).toEqual(0)
expect(
privateRoute.find('Router').prop('history').location.pathname
).toEqual('/')
})
通过此测试,您正在测试PrivateRoute
组件的实际功能,并确保它按预期运行。
该文档还有很多不足之处。例如,我花了相当多的时间才找到关于initialEntries
的propsMemoryRouter
,你需要这个所以它实际上命中了路线并执行了条件,我花了太长时间试图覆盖两个分支才意识到这是什么需要。
希望这可以帮助某人。