GN.*_*GN. 19 javascript testing reactjs enzyme
如何设置文本输入的文本,然后用React/Enzyme测试它的值?
const input = wrapper.find('#my-input');
input.simulate('change',
{ target: { value: 'abc' } }
);
const val = input.node.value;
//val is ''
Run Code Online (Sandbox Code Playgroud)
Lev*_*evi 21
要真正了解代码中发生的情况,查看组件代码(特别是onChange
处理程序)会很有用.
但是,关于以下代码:
input.simulate('change', {target: {value: 'abc'}});
Run Code Online (Sandbox Code Playgroud)
这实际上不会改变<input />
元素的值,而只是使您的onChange
函数运行并提供一个看起来像的事件对象{target: {value: 'abc'}}
.
我们的想法是你的onChange
函数会更新你的状态或存储,所以触发这个函数应该会导致你的DOM被更新.如果你实际上没有使用onChange
定义的处理程序input.simulate('change')
将不会做任何事情.
所以,如果你的目标是实际设置输入的值而不是触发onChange
处理程序,那么你可以使用JS来手动更新DOM,wrapper.find('#my-input').node.value = 'abc';
但这会绕过React的渲染周期,你可能会看到这个值被清除/删除如果你做任何事情来触发重新渲染.
lea*_*ico 20
我使用的是React 16
和Enzyme 3.10
在这里,这对我来说完全工作(想太多不同意见那里后):
wrapper.find("input").instance().value = "abc";
Run Code Online (Sandbox Code Playgroud)
显然,在以前的版本中,你可以使用node
或getNode()
代替instance()
,这是我之前许多尝试的一部分.
这适用于酶3和酶2:
wrapper.find('input').getDOMNode().value = 'new value';
wrapper.find('input').simulate('change');
Run Code Online (Sandbox Code Playgroud)
.getDOMNode()
可以像.node
在酶2中一样使用,也可以.instance()
在酶3中使用。
归档时间: |
|
查看次数: |
17730 次 |
最近记录: |