概要を動作するようには思えません。私はそのcomponentWillMount
でネイティブのDOMイベントをリスンするコンポーネントに反応テストしようとしていますjsdom:は、dispatchEvent /のaddEventListenerは
。
イベントのディスパッチとイベントリスナーの追加に関してjsdom(@8.4.0
)が期待どおりに機能しないことが判明しました。
私は抽出することができ、コードの最も簡単なビット:
window.addEventListener('click',() => {
throw new Error("success")
})
const event = new Event('click')
document.dispatchEvent(event)
throw new Error('failure')
これは、 "失敗" をスローします。
コンテキスト:上記はXY problemされる危険が
、私はより多くのコンテキストを提供します。
私がテストしようとしているコンポーネントの抽出/簡略化されたバージョンです。 You can see it working on 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>
}
}
ここで私が書いてみようとしているテストです。ただ、完全を期すために、ここでjsdomを初期化し、私のtest_helper.js
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/)
})
})
されています:
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]
}
})
再生の場合:https://github.com/jbinto/repro-jsdom-events-not-firing
:
私はここにREPROケースを持っています git clone https://github.com/jbinto/repro-jsdom-events-not-firing.git cd repro-jsdom-events-not-firing npm install npm test
'新しいwindow.Event( "クリック");' ermagerd。 'doc.createEvent( 'MouseEvents')。initEvent( 'click'、true、true)' jsdom ... 1.5時間でundefinedを返します。 – Larry