I want to use TestUtils.Simulate.mouseMove on the document. I have a component Dragger that adds a mouseMove event listener to the document. Here is an incomplete version:
// Dragger.js
'use strict';
var React = require('react');
export default React.createClass({
propTypes: {
handleDrag: React.PropTypes.func // callback set by parent
},
getInitialState: function() {
return {dragging: false}
},
componentDidUpdate: function(props, state) {
//
if (this.state.dragging && !state.dragging) {
document.addEventListener('mousemove', this.onMouseMove)
} else if (!this.state.dragging && state.dragging) {
document.removeEventListener('mousemove', this.onMouseMove)
}
},
onMouseDown: function(e) {
this.setState({dragging: true})
},
onMouseMove: function(e) {
// Calls back to the parent with the drag
this.props.handleDrag(e);
},
render: function() {
return <div onMouseDown={this.onMouseDown} ></div>
}
});
I'm using jasmine, and I want to make sure my handleDrag callback is called after a mouseDown followed by a mouseMove.
// Dragger.spec.js
var React = require('react/addons');
import Dragger from './Dragger';
var TestUtils = React.addons.TestUtils;
describe('Dragger', function() {
it('should call the callback after drag interaction', function() {
// make callback to spy on
var f = {callback: function(e){return}};
// render Dragger
var dragger = TestUtils.renderIntoDocument(<Dragger handleDrag={f.callback} />);
// spy on callback
spyOn(f, 'callback');
// simulate a mouseDown and mouseMove
TestUtils.Simulate.mouseDown(dragger.getDOMNode(), {button: 0});
TestUtils.Simulate.mouseMove(document);
expect(f.callback).toHaveBeenCalled(); // FAILS!
}
}
But the mouseMove event is not being properly simulated. I see 2 problems
- I might need to pass event data to
TestUtils.Simulate.mouseMove. For example, the callTestUtils.Simulate.mouseDown(dragger.getDOMNode())did not work until I changed it toTestUtils.Simulate.mouseDown(dragger.getDOMNode(), {button: 0}). What event data should I pass toTestUtils.Simulate.mouseMove? - The
documentis not part of the detached DOM that the test component is rendered into. This could be another reason theSimulate.mouseMovedoesn't work. What can I use in the test instead ofdocument?
How can I use TestUtils.Simulate.mouseMove?
This is an old post but I see there isn't a posted solution yet, I run into it because I am writing a similar component. I think the problem is that you are focusing on the wrong event, you should be using
onDragfor dragging detection, here's an adapted version of your code that is working for me:and