测试React中的点击事件是否会更新HTML
Test that a click event in React updates the HTML
我已经设置了一些React组件的测试,该组件使用Mocha显示一个表。我可以断言它的初始状态,但我有一个点击事件,它对我想测试的数据进行排序。
如果我使用React.addons.TestUtils.Simulate.click(theComponent)
尝试测试排序。
- 我可以看到事件得到了处理
- 状态更改已启动
- 在调用
setState
之前对数据进行排序
但当我对组件断言时,没有任何变化。
it('sorts the data when the year header is clicked', function() {
var React = require('react/addons');
var TestUtils = React.addons.TestUtils;
var payTable = TestUtils.renderIntoDocument(
<PayTable payYears={data} />
);
var headers = TestUtils.scryRenderedDOMComponentsWithTag(payTable, 'th');
var yearHeader = headers[0];
TestUtils.Simulate.click(yearHeader.getDOMNode());
var columnValues = getYearColumnValues(payTable, TestUtils);
columnValues.should.match([ 'Year', '1066', '1067', '1068' ]);
});
我需要强制更新吗?是否重新读取组件?
该代码可在Github上获得。
我可以测试组件的其他方面,但不能测试setState
之后的组件值
我遇到了同样的问题。问题是,TestUtils.Simulate.click(yearHeader.getDOMNode())
正在点击DOM,这带来了对数据的排序和DOM操作。即使使用jsDom而不是真正的dom,此操作本身也是异步事件。因此,只需在单击事件后立即检查DOM状态,就可以进行同步调用,其中DOM状态尚未更改。
解决方案是,使用超时为0毫秒的setTimeout
,并在那里检查DOM状态。例如:
setTimeout(function() {
var columnValues = getYearColumnValues(payTable, TestUtils);
columnValues.should.match([ 'Year', '1066', '1067', '1068' ]);
},0)
这将使您的DOM更新其状态,并且您将能够测试您的组件。
我花了很多时间试图找到一种干净的异步方式。。。最终做了这个测试:
https://github.com/yormi/test-them-all
在后台,它使用componentDidUpdate
生命周期来监听道具/状态/路由的更改。
希望它能帮助你们。无论如何,我们将非常感谢您的意见:)
相关文章:
- 这是否可能延迟客户端的UpdatePanel更新
- 是否自动更新套接字连接数据?socket.io
- 检查文档是否已经存在,如果是则更新,否则创建新的Mongoose
- 测试React中的点击事件是否会更新HTML
- 当数据在另一个URL上更新时,AngularJS是否可以在一个URL上触发$watch
- 是否可以在extjs5中动态更新绑定
- 如何判断Realm是否已成功更新
- Mongodb查看数组中是否所有项都存在,并更新else插入
- 强制更新是否像我认为的那样工作
- 检查第 n 个子项是否存在,如果没有,则创建并更新
- 如果外部应用程序更改了持久模型(服务器数据库),AngularJS 是否可以自动更新视图
- 是否可以在文本区域中插入文本并更新撤消/重做队列
- 是否有模板引擎可以在数据更改时更新 DOM
- 如果我有一个变量,分配给函数调用的值,如果函数调用的参数更改,是否可以更新该变量
- 在 NodeJS 中使用和更新全局变量是否安全?
- 确定元素是否由 JS 添加,还是原始 HTML 文档 *OR* 检测脚本何时通过 InnerHTML 更新节点
- 对数据库进行 AJAX 编辑时,我是否应该立即使用新数据更新接口
- 如何填充动态创建的SVG(检查DOM是否更新)
- Bokeh回调是否更新了列表而不是ColumnDataSource
- AnalyserNode是否更新其“;当前频率数据”;持续