使用Jest /酶测试经过身份验证的路由

时间:2019-03-22 15:59:07

标签: reactjs testing jestjs enzyme react-router-v4

我有一个仅在路线经过身份验证时显示的组件。

设置身份验证的方式是使用react-router v4作为HOC:

Root.js

import React from 'react';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware } from 'redux';
import reduxThunk from 'redux-thunk';
import reducers from './App/reducerIndex';

const createStoreWithMiddleware = applyMiddleware(reduxThunk)(createStore);

export default ({children, initialState={}})=>{
    return(
        <Provider store={createStoreWithMiddleware(reducers, initialState)}>
            {children}
        </Provider>
    );
}

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import { createStore, applyMiddleware } from 'redux';
import reduxThunk from 'redux-thunk';
import reducers from './App/reducerIndex';
import { AUTH_USER } from './App/actionTypes';

import App from './App/app';
import '../style/css/custom.scss';

const createStoreWithMiddleware = applyMiddleware(reduxThunk)(createStore);
const store = createStoreWithMiddleware(reducers);
const token = localStorage.getItem('token');
if (token) {
  store.dispatch({ type: AUTH_USER });
}

import Root from './root';
ReactDOM.render(
    <Root>
        <App id={token}/>
    </Root>,
    document.querySelector('.app')
);

App.js

function PrivateRoute({ component: Component, auth, ...rest }) {
  return (
    <Route
      {...rest}
      render={props =>
        auth ? (<div><Component {...props} /></div>) : (
          <Redirect to={{ pathname: '/login', state: { from: props.location } }} />
        )
      }
    />
  );
}

function PublicRoute({ component: Component, auth, ...rest }) {
  return <Route {...rest} render={props => (!auth ? <Component {...props} /> : <Redirect to="/dashboard" />)} />;
}

class App extends Component {
  static contextTypes = {
    router: PropTypes.object,
  };

  render() {
    return (
      <Router history={history} >
        <Switch>
          <PublicRoute auth={this.props.auth} path="/login" exact component={Login} />
          <PrivateRoute auth={this.props.auth} path="/dashboard" exact component={Dashboard} />
        </Switch>
      </Router>
    );
  }
}

function mapStateToProps(state) {
  return {
    auth: state.auth.authenticated,
  };
}

export default connect(
  mapStateToProps,
  null
)(App);

这是当前仪表板测试的设置方式

仪表板测试:

import React from 'react';
import { mount } from 'enzyme';
import Root from '../../../root';
import Header from './header';
import '../../../setupTests';
import Dashboard from './dashboard';

let wrapped;

beforeEach(() => {
    const initialState = {
        auth: true
    };
    wrapped = mount(
        <Root initialState={initialState}>
            <Dashboard />
        </Root>
    );
});


describe('Dashboard', () => {
    console.log("The component is", wrapped)
    // make our assertion and what we expect to happen
    it('header component exists', () => {
        expect(wrapped.contains(<Header />)).toBe(true)
    });
    it('renders without crashing', () => {
        expect(component.contains(<Header />)).toBe(true)

      });

});

Console.log不断告诉我该组件未定义。我是否必须将其包装在react-router周围?我很沮丧。

0 个答案:

没有答案