【发布时间】:2015-09-12 09:04:32
【问题描述】:
我想在document 上使用TestUtils.Simulate.mouseMove。我有一个组件Dragger,它将mouseMove 事件侦听器添加到document。这是一个不完整的版本:
// 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>
}
});
我正在使用jasmine,并且我想确保在mouseDown 后跟mouseMove 之后调用我的handleDrag 回调。
// 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!
}
}
但是mouseMove 事件没有被正确模拟。我看到了 2 个问题
- 我可能需要将事件数据传递给
TestUtils.Simulate.mouseMove。例如,调用TestUtils.Simulate.mouseDown(dragger.getDOMNode())在我将其更改为TestUtils.Simulate.mouseDown(dragger.getDOMNode(), {button: 0})之前不起作用。我应该将哪些事件数据传递给TestUtils.Simulate.mouseMove? -
document不是测试组件渲染到的detached DOM 的一部分。这可能是Simulate.mouseMove不起作用的另一个原因。我可以在测试中使用什么来代替document?
如何使用TestUtils.Simulate.mouseMove?
【问题讨论】:
-
解决你的#2:你是对的,它肯定不会通过传递文档来工作,因为 TestUtils 将你的组件呈现为一个分离的 DOM 节点。我看到你使用的是 Jasmine,所以你可能想看看这个:github.com/tommyh/jasmine-react 它提供了
jasmineReact.render,它实际上将组件渲染到一个附加的 DOM 节点中,然后为你清理它。虽然可能有几个问题导致您的代码无法工作,但我相信这至少可以解决其中一个问题 -
就使用 TestUtils 模拟 mousemove 事件而言,您可能希望尝试在组件上传递您期望的相同信息。我最近与
TestUtils.Simulate.keyDown有类似的问题,因为我使用(不正确的)文档并提供key而不是keyDown,这是我的代码所期望的。这告诉我,您可以提供几乎任何类型的假数据作为 Simulate.keyDown 的参数(在您的情况下为 mouseMove),它会接受它。