Testing a React Component with Jest

I started a new “Hello World” project on react which looks like that:

import React, { Component } from 'react';

export class Home extends Component {
    displayName = Home.name

    state = {
        result: 0,
        val1: 0,
        val2: 0,
    }

     handleChangeOne = (event) => {
        this.setState({ val1: event.target.value });
    }

    handleChangeTwo = (event) => {
        this.setState({ val2: event.target.value });
    }

    add = () => {
        this.setState({
            result: parseInt(this.state.val1) + parseInt(this.state.val2) 
        });
    }

 render() {
        return (
            <div>
                <h1>Hello world! The result is: {this.state.result}</h1>

                <input type="text" onChange={this.handleChangeOne} />
                +
                <input type="text" onChange={this.handleChangeTwo} />
                = <br />
                <button onClick={this.add}>Add</button>
            </div>
        );
      }
    }

Basically, the user insert two numbers and when he clicks the “Add” button, the result will appear on the screen.

When I run the component, it seems to work but I want to test it with Jest (Also to get familiar with Jest).

I have installed Jest and reviewed all the steps on their website but I am still not sure how should I write the test.

Inside the test, I want to insert two numbers (same as the user does) and check that it returns their sum.

So far I created a new file “Home.test.js” which is kind of a pseudo code for the test I want to perform.

Of course it’s not working now but I would love to make it work.

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import { Home } from './Home.js';


it('Returns a sum', () => {
    const home = shallow(<Home />);
    var first_val = Home.state.val1;
    var second_val = Home.state.val2;
    var result = first_val + second_val;
    expect(result).toEqual(Home.state.result);
});

Thanks in advance.

Here is Solutions:

We have many solutions to this problem, But we recommend you to use the first solution because it is tested & true solution that will 100% work for you.

Solution 1

Code:

it('returns a sum',()=>{
  const home = shallow(<Home />);
  var first_val = home.state().val1;
  var second_val = home.state().val2;
  var result = first_val + second_val;
  expect(result).toBe(0);
  const inputs=home.find('input')
  inputs.at(0).simulate('change',{target: {value: 5 } } )
  inputs.at(1).simulate('change', { target: { value: 8 } })
  home.find('button').simulate('click')
  home.update()
  expect(home.state().result).toBe(13)
})

You may find it useful.

1.Remember to access state you have to call state() like this.

home.state().somevalue
Ex:- home.state().val1

2.You have already made a wrapper from here.

const home = shallow(<Home />);

Now accessing state like this is wrong.

Home.state.val1;// it should be home.state().val1;

3.By default the state contains default values.

var first_val = home.state().val1;
var second_val = home.state().val2;
var result = first_val + second_val;
expect(result).toBe(0);//here it is.

4.To give the input values to field .First find the field and simulate the onchange as below.

const inputs=home.find('input')
inputs.at(0).simulate('change',{target: {value: 5 } } )//observe the object 
inputs.at(1).simulate('change', { target: { value: 8 } })

5.Now to add these values call the add button.

home.find('button').simulate('click')

6.Your job is not done !Don’t forget to call this.

home.update()

7.Now check the value

expect(home.state().result).toBe(13)

Note: Use and implement solution 1 because this method fully tested our system.
Thank you 🙂

All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply