Ich bin verwirrt darüber, wie ich <input>
bei der Verwendung auf Werte zugreifen soll mount
. Folgendes habe ich als Test:
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();
});
Die Konsole wird ausgedruckt undefined
. Aber wenn ich den Code leicht ändere, funktioniert es:
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();
});
Außer natürlich, dass die input.simulate
Leitung ausfällt, da ich sie render
jetzt benutze . Ich brauche beides, um richtig zu arbeiten. Wie behebe ich das?
EDIT :
Ich sollte erwähnen, <EditableText />
ist keine kontrollierte Komponente. Aber wenn ich gehe defaultValue
in <input />
, so scheint es , um den Wert einzustellen. Der zweite Codeblock oben druckt den Wert aus. Wenn ich das Eingabeelement in Chrome überprüfe und $0.value
die Konsole eingebe, wird der erwartete Wert angezeigt.
quelle
input.render()
wird nichtreact-dom
gerendert. Es ist dies: airbnb.io/enzyme/docs/api/ShallowWrapper/render.htmlshallow()
aus irgendeinem Grund nicht. Dasfocus
Ereignis löst eine Methode aus, die versucht zu referenzierenthis.refs.input
, was jedoch fehlschlägt. Aber wenn ich die Swapshallow
fürmount
, es funktioniert wie erwartet. Meistens .. (ein weiteres Problem mit der Simulation von ESC-Schlüssel)render(<EditableText defaultValue="Hello" />)
. Ich denke, Ihr Anwendungsfall ist spezialisierter als ich dachte; Ich sehe, es geht nur darum, den Eingabewert einzustellen, aber um den Fokus und "Änderungen abzubrechen". Es wäre großartig, wenn Sie einen Plunker erstellen könnten .Wenn Sie mit Enzym 3 einen Eingabewert ändern müssen, aber die
onChange
Funktion nicht auslösen müssen, können Sie dies einfach tun (node
Eigenschaft wurde entfernt ):wrapper.find('input').instance().value = "foo";
Sie können verwenden,
wrapper.find('input').simulate("change", { target: { value: "foo" }})
um aufzurufen,onChange
wenn Sie eine Requisite dafür haben (dh für gesteuerte Komponenten).quelle
NOTE: can only be called on a wrapper instance that is also the root instance.
- Aus den Dokumenten unter airbnb.io/enzyme/docs/api/ShallowWrapper/instance.htmlinstance()
kann auf jedem untergeordneten Wrapper aufgerufen werden, wenn er über gerendert wurdemount
.Ich habs. (aktualisierte / verbesserte Version)
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(); });
quelle
mount()
fügen keine Komponenten in das DOM ein. Sie können also keinen Fokus erhalten. Wir müssen ein DOM-Element hinzufügen und diecontext
Option fürmount()
input.prop('value')
Also viele verschiedene Meinungen hier. Das einzige, was für mich funktionierte, war keines der oben genannten, es wurde verwendet
input.props().value
. Ich hoffe das hilft.quelle
input.prop('value')
dass Sie Folgendes verwenden können: Wenn Sie den Namen Ihres Requisitenschlüssels kennen.Ich benutze die Create-React-App, die standardmäßig mit Scherz und Enzym 2.7.0 geliefert wird.
Das hat bei mir funktioniert:
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();
quelle
Keines der oben genannten hat bei mir funktioniert. Dies hat bei Enzyme ^ 3.1.1 für mich funktioniert:
input.instance().props.onChange(({ target: { value: '19:00' } }));
Hier ist der Rest des Codes für den Kontext:
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);
quelle
Ich verwende Reagieren mit TypeScript und das Folgende hat für mich funktioniert
wrapper.find('input').getDOMNode<HTMLInputElement>().value = 'Hello'; wrapper.find('input').simulate('change');
Wert direkt einstellen
wrapper.find('input').instance().value = 'Hello'`
verursachte mir eine Kompilierungswarnung.
quelle
Dies funktioniert bei mir mit Enzym 2.4.1:
const wrapper = mount(<EditableText defaultValue="Hello" />); const input = wrapper.find('input'); console.log(input.node.value);
quelle
console.log
ein Objekt verwendet und (Unter-) Eigenschaften durchforstet, um das zu bekommen, was ich brauchte. Dabei habe ich oft.node
in irgendeiner Form verwendet, wie Sie es getan haben. Ich kann mich jedoch nicht erinnern,.node
dass dies in einer der offiziellen Dokumentationen erwähnt wurde, was darauf hindeutet, dass es zwischen den Releases geändert / unterbrochen werden könnte, da es nicht offiziell Teil der öffentlich beworbenen API ist. Auch scheint es oft Alternativen zu geben. zBinput.node.value
===input.get(0).value
. So.node
funktionieren könnte, und ich vermute , dass manchmal wird es ein gutes Hack bieten, aber mit Vorsicht verwenden.Hier ist mein Code ..
const input = MobileNumberComponent.find('input') // when input.props().onChange({target: { id: 'mobile-no', value: '1234567900' }}); MobileNumberComponent.update() const Footer = (loginComponent.find('Footer')) expect(Footer.find('Buttons').props().disabled).equals(false)
Ich habe mein DOM mit aktualisiert
componentname.update()
und dann die Überprüfung der Senden-Schaltfläche (Deaktivieren / Aktivieren) mit einer Länge von 10 Stellen überprüft.quelle
In meinem Fall habe ich ref Rückrufe verwendet,
<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}} >
Um den Wert zu erhalten. Das Enzym ändert also nicht den Wert von this._username.
Also musste ich:
login.node._username.value = "[email protected]"; user.simulate('change'); expect(login.state('mailValid')).toBe(true);
Um den Wert einstellen zu können, rufen Sie change auf. Und dann behaupten.
quelle
Das hat bei mir funktioniert:
let wrapped = mount(<Component />); expect(wrapped.find("input").get(0).props.value).toEqual("something");
quelle
Für den Fall, dass jemand Probleme hat, habe ich Folgendes für mich gefunden
const wrapper = mount(<NewTask {...props} />); // component under test const textField = wrapper.find(TextField); textField.props().onChange({ target: { value: 'New Task 2' } }) textField.simulate('change'); // wrapper.update() didn't work for me, need to find element again console.log(wrapper.find(TextField).props()); // New Task 2
Es scheint, dass Sie zuerst definieren müssen, was im Änderungsereignis passiert, und es dann simulieren müssen (anstatt das Änderungsereignis mit Daten zu simulieren).
quelle
Ich habe auf sehr einfache Weise gelöst:
const wrapper: ShallowWrapper = shallow(<ProfileViewClass name: 'Sample Name' />);
<input type='text' defaultValue={props.name} className='edituser-name' />
wrapper.find(element).props().attribute-name
:it('should render user name', () => { expect(wrapper.find('.edituser-name').props().defaultValue).toContain(props.name); });
Prost
quelle
Ich verwende die setValue- Methode von Wrapper [ https://vue-test-utils.vuejs.org/api/wrapper/#setvalue-value] , um den Wert festzulegen .
inputA = wrapper.findAll('input').at(0) inputA.setValue('123456')
quelle
.simulate()
funktioniert bei mir irgendwie nicht, ich habe es geschafft, nur auf das zuzugreifen,node.value
ohne anrufen zu müssen.simulate()
; in deinem Fall:const wrapper = mount(<EditableText defaultValue="Hello" />); const input = wrapper.find('input').at(0); // Get the value console.log(input.node.value); // Hello // Set the value input.node.value = 'new value'; // Get the value console.log(input.node.value); // new value
Hoffe das hilft für andere!
quelle
.node
Sie verwenden sollten ,.instance()
oder.getDOMNode()
hängt , wenn Sie das Ergebnis als ReactElement oder DOMComponent verwendet.