Энзим-как получить доступ и установить значение?
Я смущен тем, как получить доступ <input>
значение при использовании mount
. Вот что я получил в качестве теста:
it('cancels changes when user presses esc', done => {
const wrapper = mount(<EditableText defaultValue="Hello" />);
const input = wrapper.find('input');
console.log(input.render().attr('value'));
input.simulate('focus');
done();
});
консоль выводит undefined
. Но если я немного изменю код, он будет работать:
it('cancels changes when user presses esc', done => {
const wrapper = render(<EditableText defaultValue="Hello" />);
const input = wrapper.find('input');
console.log(input.val());
input.simulate('focus');
done();
});
кроме, конечно,input.simulate
строка не работает, так как я использую render
сейчас. Мне нужно, чтобы оба работали как следует. Как это исправить?
редактировать:
Я должен упомянуть, <EditableText />
не является контролируемым компонентом. Но когда я пройду defaultValue
на <input />
, кажется, установить значение. Второй блок кода выше распечатывает значение, а также, если я проверяю входной элемент в Chrome и набираю .value
в консоли отображается ожидаемое значение.
9 ответов
Я думаю, что вы хотите:
input.simulate('change', { target: { value: 'Hello' } })
вам не нужно использовать render()
anywhere, чтобы установить значение. И просто FYI, вы используете два разных render()
' s. Один в вашем первом блоке кода от Enzyme и является методом на объекте wraper mount
и find
дам тебе. Второй, хотя он не на 100% ясен, вероятно, является одним из react-dom
. Если вы используете энзим, то как раз используйте shallow
или mount
as соответствующий и нет необходимости render
С react-dom
.
получил его. (обновленная/улучшенная версия)
it('cancels changes when user presses esc', done => {
const wrapper = mount(<EditableText defaultValue="Hello" />);
const input = wrapper.find('input');
input.simulate('focus');
input.simulate('change', { target: { value: 'Changed' } });
input.simulate('keyDown', {
which: 27,
target: {
blur() {
// Needed since <EditableText /> calls target.blur()
input.simulate('blur');
},
},
});
expect(input.get(0).value).to.equal('Hello');
done();
});
Я использую create-react-app, который поставляется с шуткой по умолчанию и ферментом 2.7.0.
это сработало для меня:
const wrapper = mount(<EditableText defaultValue="Hello" />);
const input = wrapper.find('input')[index]; // where index is the position of the input field of interest
input.node.value = 'Change';
input.simulate('change', input);
done();
так много разных мнений здесь. Единственное, что сработало для меня, не было ничего из вышеперечисленного, это использование input.props().value
. Надеюсь, это поможет.
это работает для меня, используя фермент 2.4.1:
const wrapper = mount(<EditableText defaultValue="Hello" />);
const input = wrapper.find('input');
console.log(input.node.value);
ничего из вышеперечисленного не сработало для меня. Это то, что сработало для меня на Энзиме ^3.1.1:
input.instance().props.onChange(({ target: { value: '19:00' } }));
вот остальная часть кода для контекста:
const fakeHandleChangeValues = jest.fn();
const fakeErrors = {
errors: [{
timePeriod: opHoursData[0].timePeriod,
values: [{
errorIndex: 2,
errorTime: '19:00',
}],
}],
state: true,
};
const wrapper = mount(<AccessibleUI
handleChangeValues={fakeHandleChangeValues}
opHoursData={opHoursData}
translations={translationsForRendering}
/>);
const input = wrapper.find('#input-2').at(0);
input.instance().props.onChange(({ target: { value: '19:00' } }));
expect(wrapper.state().error).toEqual(fakeErrors);
в моем случае я использовал обратные вызовы ref,
<input id="usuario" className="form-control" placeholder="Usuario"
name="usuario" type="usuario"
onKeyUp={this._validateMail.bind(this)}
onChange={()=> this._validateMail()}
ref={(val) =>{ this._username = val}}
>
для получения значения. Так что энзим не изменит значения этого._имя пользователя.
Я использую setValue обертки[https://vue-test-utils.vuejs.org/api/wrapper/#setvalue-value] метод для установки значения.
inputA = wrapper.findAll('input').at(0)
inputA.setValue('123456')