Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

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?

like image 754
jslutzky Avatar asked Feb 18 '17 18:02

jslutzky


1 Answers

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);   }); }); 
like image 64
Canastro Avatar answered Sep 27 '22 22:09

Canastro