Summary:
I am trying to test a React component that listens for its own DOM events in its componentWillMount .
I find jsdom ( @8.4.0 ) is not working properly when it comes to dispatching events and adding event listeners.
The simplest bit of code I can extract:
window.addEventListener('click', () => { throw new Error("success") }) const event = new Event('click') document.dispatchEvent(event) throw new Error('failure')
This causes a failure.
Context:
Due to the fact that the above problem is XY , I want to provide more context.
Here is an extracted / simplified version of the component I'm trying to verify. You can see how it works in Webpackbin.
import React from 'react' export default class Example extends React.Component { constructor() { super() this._onDocumentClick = this._onDocumentClick.bind(this) } componentWillMount() { this.setState({ clicked: false }) window.addEventListener('click', this._onDocumentClick) } _onDocumentClick() { const clicked = this.state.clicked || false this.setState({ clicked: !clicked }) } render() { return <p>{JSON.stringify(this.state.clicked)}</p> } }
Here is the test I'm trying to write.
import React from 'react' import ReactDOM from 'react-dom' import { mount } from 'enzyme' import Example from '../src/example' describe('test', () => { it('test', () => { const wrapper = mount(<Example />) const event = new Event('click') document.dispatchEvent(event) // at this point, I expect the component to re-render, // with updated state. expect(wrapper.text()).to.match(/true/) }) })
Just for completeness, here is my test_helper.js that initializes jsdom:
import { jsdom } from 'jsdom' import chai from 'chai' const doc = jsdom('<!doctype html><html><body></body></html>') const win = doc.defaultView global.document = doc global.window = win Object.keys(window).forEach((key) => { if (!(key in global)) { global[key] = window[key] } })
Playback Case:
I have an example to play here: https://github.com/jbinto/repro-jsdom-events-not-firing
git clone https://github.com/jbinto/repro-jsdom-events-not-firing.git cd repro-jsdom-events-not-firing npm install npm test
javascript testing jsdom
Jesse buchanan
source share