Testing with TypeScript, Enzyme, and React
- 3/23/2018
- ·
- #typescript
- #react
- #testing
- #howto
TypeScript and Enzyme can provide a
friendly, typesafe alternative to React’s own testing facilities. While we’ve
previously looked at testing TypeScript with
Jest and React’s own
ShallowRenderer
, it’s little
trouble to add Enzyme’s rich selector syntax to the mix.
Setting up Jest
If you’ve already configured Jest via the earlier tutorial or the
create-react-app
bootstrap, skip ahead to the next section. Otherwise, let’s make sure the
runner is installed!
$ npm install --save-dev raf jest ts-jest @types/jest
We’ll also need to configure jest to compile TypeScript files and prepare it
for Enzyme. Add a "jest"
entry in package.json
with the following:
"jest": {
"moduleFileExtensions": ["ts", "tsx", "js"],
"transform": {
"\\.(ts|tsx)$": "<rootDir>/node_modules/ts-jest/preprocessor.js"
},
"setupFiles": [
"raf/polyfill"
],
"testRegex": "/__tests__/.*\\.(ts|tsx|js)$",
"setupTestFrameworkScriptFile": "<rootDir>src/setupTests.ts"
}
That’s it! We’re ready to go.
Just add Enzyme
Enzyme installation with TypeScript barely changes from vanilla JavaScript. Just grab the package, a react adapter, and the corresponding type definitions:
$ npm install --save-dev enzyme enzyme-adapter-react-16
$ npm install --save-dev @types/enzyme @types/enzyme-adapter-react-16
We’ll need to configure Enzyme to use the adapter, which we can do in Jest’s
bootstrap file. Except for a wildcard import
, this looks exactly as it would
in JavaScript:
// src/setupTests.ts
import * as Enzyme from 'enzyme'
import * as Adapter from 'enzyme-adapter-react-16'
Enzyme.configure({
adapter: new Adapter(),
})
Finally, if we want to take advantage of what might be Jest’s knockout feature, we’ll also need an enzyme-compatible snapshot serializer:
$ npm install --save-dev enzyme-to-json
Add the serializer to the jest
configuration in package.json
, and we’re
ready to get on to the tests.
{
"jest": {
"snapshotSerializers": ["enzyme-to-json"]
}
}
Start Testing
Let’s put Enzyme’s shallow
renderer to work to make sure everything is up and
running:
// __tests__/hello_world.test.js
import { shallow } from 'enzyme'
describe('Hello, Enzyme!', () => {
it('renders', () => {
const wrapper = shallow(<div>
<h1>Hello, Enzyme!</h1>
</div>)
expect(wrapper.find('h1').html()).toMatch(/Hello, Enzyme/)
})
it('renders snapshots, too', () => {
const wrapper = shallow(<div>
<h1>Hello, Enzyme!</h1>
</div>)
expect(wrapper).toMatchSnapshot()
})
})
Hit “run”, and it’s all green. We’re set up and ready to begin testing with Enzyme!
Find a demo of Enzyme testing several common React patterns in the React with TypeScript repository on Github.