jazzdom
v1.2.0
Published
Promisified jsdom setup and teardown for your test runner.
Downloads
12
Readme
jazzdom
Promisified jsdom setup and teardown for your test runner.
Inspired from, and wraps, jsdom-global. Depends on jsdom.
Install
yarn add -D jazzdom jsdom jsdom-global
Setup
Option 1: Setting up and tearing down for tests that need a document object
import jazzdom from 'jazzdom'
describe('some tests', () => {
before(() => jazzdom.create())
after(() => jazzdom.destroy())
// ... test content here
}
Option 2: Global setup line for test/mocha.opts
Don't do this if you plan to use the other setup option.
--require jazzdom/register
Example
In your mocha tests:
import React from 'react'
import { mount, shallow } from 'enzyme'
import jazzdom from 'jazzdom'
describe('Example', () => {
const Parent = ({ children }) => <div className="parent">{children}</div>
describe('without jazzdom integration', () => {
it('shallow renders without need of jsdom', () => {
const wrapper = shallow(
<Parent><div className="child" /></Parent>
)
expect(wrapper.find('div.child')).to.exist
})
})
describe('with basic integration', () => {
before(() => jazzdom.create())
after(() => jazzdom.destroy())
it('mounts with the help of jsdom', () => {
const wrapper = mount(
<Parent><div className="child" /></Parent>
)
expect(wrapper.find('div.child')).to.exist
})
})
Best practices
- If you trust your tests to clean up after themselves, you may wish to call
require ('jazzdom/register')
only once across your entire test suite, since that may result in speed improvements. - It can be good to separate fast and slow tests. "slow" tests would require
jazzdom.create()
, or other expensive tasks, and "fast" tests would not. Name them with slightly different patterns, and have two different test rules inpackage.json
to call each suite. Prefer to have more fast tests and less slow tests. Instead of making multiple slow tests, consider making one slow test and spies for the remaining tests, if that makes sense for the situation. - Try to call
jazzdom.create()
andjazzdom.destroy()
only when they're needed, such as withenzyme.mount()
, and omit them withenzyme.shallow()
andenzyme.render()
. - It's almost never a good idea to put
jazzdom.create()
andjazzdom.destroy()
in abeforeEach()
orafterEach()
block. Preferbefore()
andafter()
blocks, or in dedicatedit()
blocks if your test runner doesn't supportbefore
/after
.
Additional features compared to jsdom-global
- Returns promises in separate
create()
anddestroy()
functions - Automatically routes
console
output from<script>
tags into the standard node.jsconsole
object - Waits for jsdom
created
event to be fired before fulfilling or rejecting promise - If you forgot to
destroy()
the previous setup, the nextcreate()
call will throw an error that points to the previous invocation
License
MIT