Ich habe eine Higher Order Component/Komponent Component erstellt, um sicherzustellen, dass ein Benutzer authentifiziert wird, bevor die Komponente geladen wird. Es ist sehr einfach, aber ich habe Probleme damit, es zu testen. Ich möchte die folgenden Punkte prüfen, die zu den Prüfungen ähnlich sind, habe ich bereits an anderer Stelle:Enzyme testen eine Authentifizierung Higher Order Component (HOC)
- Renders die Komponente (I normalerweise überprüfen, indem der Suche nach einem Component spezifischen
className
) - Hat richtig
props
(in meinem Fallauthenticated
) - Renders die verpackte Komponente, wenn
authenticated
und machtnull
wenn nicht
die HOC:
import React from 'react';
import { connect } from 'react-redux';
import { createStructuredSelector } from 'reselect';
import { makeSelectAuthenticated } from 'containers/App/selectors';
export default function RequireAuth(ComposedComponent) {
class AuthenticatedComponent extends React.Component {
static contextTypes = {
router: React.PropTypes.object,
}
static propTypes = {
authenticated: React.PropTypes.bool,
}
componentWillMount() {
if (!this.props.authenticated) this.context.router.push('/');
}
componentWillUpdate(nextProps) {
if (!nextProps.authenticated) this.context.router.push('/');
}
render() {
return (
<div className="authenticated">
{ this.props.authenticated ? <ComposedComponent {...this.props} /> : null }
</div>
);
}
}
const mapStateToProps = createStructuredSelector({
authenticated: makeSelectAuthenticated(),
});
return connect(mapStateToProps)(AuthenticatedComponent);
}
Ich verwende enzyme
und jest
für meine Tests, aber habe keine Möglichkeit gefunden, die HOC während meiner Tests erfolgreich zu rendern.
Irgendwelche Ideen?
Lösung dank unten beantworten:
import React from 'react';
import { shallow, mount } from 'enzyme';
import { Provider } from 'react-redux';
import { AuthenticatedComponent } from '../index';
describe('AuthenticatedComponent',() => {
let MockComponent;
beforeEach(() => {
MockComponent =() => <div />;
MockComponent.displayName = 'MockComponent';
});
it('renders its children when authenticated',() => {
const wrapper = shallow(
<AuthenticatedComponent
composedComponent={MockComponent}
authenticated={true}
/>,
{ context: { router: { push: jest.fn() } } }
);
expect(wrapper.find('MockComponent').length).toEqual(1);
});
it('renders null when not authenticated',() => {
const wrapper = shallow(
<AuthenticatedComponent
composedComponent={MockComponent}
authenticated={false}
/>,
{ context: { router: { push: jest.fn() } } }
);
expect(wrapper.find('MockComponent').length).toEqual(0);
});
});
Danke für die Erklärung ist es Ihnen möglich, ein Beispiel zu geben, wie man nur machen die Komponente im Test? Ich habe viele verschiedene Methoden mit 'shallow' und' mount' ausprobiert, aber es scheint nicht zu funktionieren, dass alles zum Testen richtig gerendert wird. – germainelol
Auch ein bisschen verwirrt durch die 'composedComponent' -Variable, die Sie an' mapStateToProps' übergeben. Das wird immer noch normal funktionieren? – germainelol
Ein Beispiel hinzugefügt, wie Sie die 'AuthenticatedComponent' testen können. Ich stimme der Verwendung von mapStateToProps zu, um die 'composedComponent' zu übergeben, sieht ein bisschen komisch aus. Da die 'AuthenticatedComponent' nun außerhalb der HOC definiert ist, können wir sie nur über Props übergeben. Ich dachte, wir können einfach 'mapStateToProps' oder das verwenden. – PhilippSpo