https://reacttraining.com/react-router/web/example/auth-workflow
我在react-router-dom文档中实现的Private路由
function PrivateRoute({ authenticated, ownProps }) {
let {component:Component, ...rest} = ownProps
//PrivateRoute, If not authenicated ie false, redirect
return (
<Route
// JSX Spread sttributes to get path for Route
{...rest}
render={() => authenticated ? (
<Component />
) :
<Redirect
to={{pathname: "/" }}
/>
}
/>
);
}
export default PrivateRoute
PrivateRoute是从Redux存储获取身份验证状态的已连接组件。
我正在尝试使用redux模拟存储和mount from Ezyme测试连接的组件。
import configureStore from 'redux-mock-store'
const mockStore = configureStore()
const authStateTrue = {auth: {AUTHENTICATED: true}};
test('Private path renders a component when auntentication is true', () => {
const store = mockStore(authStateTrue)
const AComponent = () => <div>AComponent</div>
const props = {path:"/aprivatepath" ,component:<AComponent/>};
let enzymeWrapper = mount(<Provider store={store}>
<BrowserRouter>
<PrivateRoute path="/aprivatepath" component={AComponent}/>
</BrowserRouter>
</Provider>);
expect(enzymeWrapper.exists(AComponent)).toBe(true)
});
即使状态中的身份验证为真,传递给私人路由的组件似乎也不存在。
我如何测试一个组件是呈现或重定向在私人路由。
下面是单元测试解决方案:
私人oute.tsx
import React from 'react';
import { Route, Redirect } from 'react-router';
function PrivateRoute({ authenticated, ownProps }) {
const { component: Component, ...rest } = ownProps;
return <Route {...rest} render={() => (authenticated ? <Component /> : <Redirect to={{ pathname: '/' }} />)} />;
}
export default PrivateRoute;
私人oute.test.tsx
:
import PrivateRoute from './privateRoute';
import React from 'react';
import { mount } from 'enzyme';
import { MemoryRouter, Redirect } from 'react-router';
describe('56730186', () => {
it('should render component if user has been authenticated', () => {
const AComponent = () => <div>AComponent</div>;
const props = { path: '/aprivatepath', component: AComponent };
const enzymeWrapper = mount(
<MemoryRouter initialEntries={[props.path]}>
<PrivateRoute authenticated={true} ownProps={props} />
</MemoryRouter>,
);
expect(enzymeWrapper.exists(AComponent)).toBe(true);
});
it('should redirect if user is not authenticated', () => {
const AComponent = () => <div>AComponent</div>;
const props = { path: '/aprivatepath', component: AComponent };
const enzymeWrapper = mount(
<MemoryRouter initialEntries={[props.path]}>
<PrivateRoute authenticated={false} ownProps={props} />
</MemoryRouter>,
);
const history: any = enzymeWrapper.find('Router').prop('history');
expect(history.location.pathname).toBe('/');
});
});
100%覆盖率的单元测试结果:
PASS src/stackoverflow/56730186/privateRoute.test.tsx (15.063s)
56730186
✓ should render component if user has been authenticated (96ms)
✓ should redirect if user is not authenticated (23ms)
------------------|----------|----------|----------|----------|-------------------|
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s |
------------------|----------|----------|----------|----------|-------------------|
All files | 100 | 100 | 100 | 100 | |
privateRoute.tsx | 100 | 100 | 100 | 100 | |
------------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests: 2 passed, 2 total
Snapshots: 0 total
Time: 17.053s
源代码:https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/56730186
问题内容: 我有时看到人们在导出组件时将它们包装起来: 这是做什么用的,什么时候应该使用? 问题答案: 当您在应用程序中包含主页组件时,通常将其包装在这样的组件中: 这样,该组件便可以访问,因此可以使用重定向用户。 某些组件(通常是标头组件)出现在每个页面上,因此没有包装在中: 这意味着标题不能重定向用户。 要解决此问题,可以在导出时将标头组件包装在一个函数中: 这使组件可以访问,这意味着标题现在
我有类似这样的App.js文件 而看起来是这样的 我需要使,和工作 我尝试了上述方法,但输出是空白的,当我去任何这些路线。只有Navbar被渲染。
问题内容: 我在react-router-dom中需要多个嵌套路由 我正在使用v4的react-router-dom 我有我的 我需要像这样渲染的组件 Home组件包含一个Page1,Page2和Page3组件共有的Header组件,但在Login和About中不存在。 我的js代码看起来像这样 我希望Login组件仅在/ login上显示当我请求/ page1,/ page2,/ page3时,
我有一个react/redux应用程序,使用“react router dom”进行路由。我在我的App.js中使用了以下内容(标记为react bootstrap,以提供私有路由。如果且仅当用户未登录时(基于cookie的存在),预期行为将重定向到)。实际行为是,即使用户登录,应用程序也会立即重定向到。 函数发送一个redux操作,该操作将提取包含auth令牌(如果存在)的cookie,并将其置
关于未解决的问题(作为最终结论) react路由器dom v4中的多个嵌套路由 如何在React路由器v4中嵌套路由 我也有同样的问题。 https://reacttraining.com/react-router/web/guides/quick-start促进react-router-dom 此外,人们发现最好在一个文件中列出路由,而不是在组件内部。 有人提到:https://github.c