React - Test Utilities Docs
I have a Login component which will display a Notification component if this.state.error
is true.
I'm now writing a Jest test to test this.
import React from 'react' import ReactTestUtils from 'react-dom/test-utils'; import { shallow } from 'enzyme' import toJson from 'enzyme-to-json' import Login from './Login' import Notification from '../common/Notification' describe('<Login /> component', () => { it('should render', () => { const loginComponent = shallow(<Login />); const tree = toJson(loginComponent); expect(tree).toMatchSnapshot(); }); it('should contains the words "Forgot Password"', () => { const loginComponent = shallow(<Login />); expect(loginComponent.contains('Forgot Password')).toBe(true); }); // This test fails it('should render the Notification component if state.error is true', () => { const loginComponent = ReactTestUtils.renderIntoDocument( <Login /> ); const notificationComponent = ReactTestUtils.renderIntoDocument( <Notification /> ); loginComponent.setState({ error: true }, expect(ReactTestUtils.isDOMComponent(notificationComponent)).toBe(true)); }); });
In the last part of my code I've also tried this to no avail
loginComponent.setState({ error: true }, expect(ReactTestUtils. isElement(notificationComponent)).toBe(true));
https://facebook.github.io/react/docs/test-utils.html
render() { const usernameError = this.state.username.error; const error = this.state.error; const errorMsg = this.state.errorMsg; return ( <div className="app-bg"> { error && <Notification message={ errorMsg } closeMsg={ this.closeMessage }/> } <section id="auth-section"> <header> <img src="static/imgs/logo.png"/> <h1>tagline</h1> </header>
it('should render the Notification component if state.error is true', () => { const loginComponent = ReactTestUtils.renderIntoDocument( <Login /> ); const notificationComponent = ReactTestUtils.renderIntoDocument( <Notification /> ); // loginComponent.setState({ // error: true // }, expect(ReactTestUtils.isDOMComponent(notificationComponent)).toBe(true)); const checkForNotification = () => { const login = shallow(<Login />); expect(login.find(Notification).length).toBe(1); }; loginComponent.setState({ error: true }, checkForNotification()); });
But that test also failed.
Also tried const login = mount(<Login />);
Anyone else running into a problem using Jest and the React Test Utilities?
React is a JavaScript library developed by Facebook which, among other things, was used to build Instagram.com. Its aim is to allow developers to easily create fast user interfaces for websites and applications alike.
To get an overview of what React is, you can write React code directly in HTML. But in order to use React in production, you need npm and Node. js installed.
React is better than Angular due to it's virtual DOM implementation and rendering optimizations. Migrating between React's versions is quite easy, too; you don't need to install updates one by one, as in the case of Angular. Finally, with React, developers have myriads of existing solutions they can use.
Figured it out! Did not need React Test Utilities
it('should render the Notification component if state.error is true', () => { const loginComponent = shallow(<Login />); loginComponent.setState({ error: true }); expect(loginComponent.find(Notification).length).toBe(1); });
This will set the state of error to true in the Login component, then check if the Login component contains the Notification component.
This should probably be refactored a bit. The Notification
component should probably be always rendered in a more global component (like a Page Wrapper or some sort of other container), and it should probably render null
unless there's errors within a global reducer. A Login
component probably shouldn't maintain the responsibility and business logic regarding notifications.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With