React & Enzyme: why isn't beforeEach() working?

24,687

You are defining the wrapper const inside of the beforeEach scope, move it outside like this:

import React from 'react';
import { shallow } from 'enzyme';
import Home from '../components/Home';
import IntroText from '../components/IntroText';
import Form from '../components/Form';

describe('<Home />', () => {
  let wrapper;
  beforeEach(() => {
    wrapper = shallow(<Home />);
  });

  it('renders the IntroText component', () => {
    expect(wrapper.find(IntroText).length).toBe(1);
  });

  it('renders the Form component', () => {
    expect(wrapper.find(Form).length).toBe(1);
  });
});

This way you'll have access to wrapper inside of the its scope.

Constants are block-scoped, much like variables defined using the let statement. The value of a constant cannot change through re-assignment, and it can't be redeclared.

Since you want to assign the variable inside of the beforeEach scope and use it inside of the it scopes, you'll have to declare the variable in a common scope, which, in this case is the describe scope.

Added (works on mocha but not on jest):

Another possible way to fix this is to use the this keyword (which I prefer, if using mocha... Does not work with jest).

import React from 'react';
import { shallow } from 'enzyme';
import Home from '../components/Home';
import IntroText from '../components/IntroText';
import Form from '../components/Form';

describe('<Home />', function() {
  beforeEach(function() {
    this.wrapper = shallow(<Home />);
  });

  it('renders the IntroText component', function() {
    expect(this.wrapper.find(IntroText).length).toBe(1);
  });

  it('renders the Form component', function() {
    expect(this.wrapper.find(Form).length).toBe(1);
  });
});
Share:
24,687
jslutzky
Author by

jslutzky

Updated on January 01, 2020

Comments

  • jslutzky
    jslutzky over 4 years

    I'm writing my first React tests and running into an issue where my beforeEach statement isn't working. Here's my test file:

    import React from 'react';
    import { shallow } from 'enzyme';
    import Home from '../components/Home';
    import IntroText from '../components/IntroText';
    import Form from '../components/Form';
    
    describe('<Home />', () => {
      beforeEach(() => {
        const wrapper = shallow(<Home />);
      });
    
      it('renders the IntroText component', () => {
        expect(wrapper.find(IntroText).length).toBe(1);
      });
    
      it('renders the Form component', () => {
        expect(wrapper.find(Form).length).toBe(1);
      });
    });
    

    Here's the relevant part of my package.json:

    "devDependencies": {
      "babel-jest": "^18.0.0",
      "babel-preset-es2015": "^6.22.0",
      "babel-preset-react": "^6.23.0",
      "jest": "^18.1.0",
      "react-scripts": "0.9.0",
      "react-test-renderer": "^15.4.2"
     },
    "dependencies": {
      "enzyme": "^2.7.1",
      "jest-enzyme": "^2.1.2",
      "react": "^15.4.2",
      "react-addons-test-utils": "^15.4.2",
      "react-dom": "^15.4.2",
      "react-router": "^3.0.2"
    },
    "scripts": {
      "start": "react-scripts start",
      "build": "react-scripts build",
      "test": "react-scripts test --env=jsdom",
      "eject": "react-scripts eject"
    }
    

    I get this error when the tests run:

    ReferenceError: wrapper is not defined
    

    What am I missing?