Je ne sais pas comment accéder à la <input>
valeur lors de l'utilisation mount
. Voici ce que j'ai comme 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();
});
La console imprime undefined
. Mais si je modifie légèrement le code, cela fonctionne:
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();
});
Sauf, bien sûr, la input.simulate
ligne échoue depuis que je l'utilise render
maintenant. J'ai besoin des deux pour fonctionner correctement. Comment puis-je réparer ça?
MODIFIER :
Je devrais mentionner, <EditableText />
n'est pas un composant contrôlé. Mais quand je passe defaultValue
dans <input />
, il semble fixer la valeur. Le deuxième bloc de code ci-dessus imprime la valeur, et de même, si j'inspecte l'élément d'entrée dans Chrome et que je tape $0.value
dans la console, il affiche la valeur attendue.
la source
input.render()
n'est pasreact-dom
rendu. C'est ceci: airbnb.io/enzyme/docs/api/ShallowWrapper/render.htmlshallow()
cela ne fonctionne pas pour une raison quelconque ... l'focus
événement déclenche une méthode qui tente de référencerthis.refs.input
, qui échoue. Mais quand je changeshallow
pourmount
, cela fonctionne comme prévu. Surtout .. (encore un problème avec la simulation de la touche ESC)render(<EditableText defaultValue="Hello" />)
. Je pense que votre cas d'utilisation est plus spécialisé que je ne le pensais; Je vois qu'il traite simplement de la définition de la valeur d'entrée mais avec le focus et "l'annulation des modifications". Ce serait formidable si vous pouviez créer un plunker .Avec Enzyme 3 , si vous avez besoin de changer une valeur d'entrée mais que vous n'avez pas besoin de déclencher la
onChange
fonction, vous pouvez simplement le faire (lanode
propriété a été supprimée ):wrapper.find('input').instance().value = "foo";
Vous pouvez utiliser
wrapper.find('input').simulate("change", { target: { value: "foo" }})
pour invoqueronChange
si vous avez un accessoire pour cela (c'est-à-dire pour les composants contrôlés).la source
NOTE: can only be called on a wrapper instance that is also the root instance.
- extrait de la documentation sur airbnb.io/enzyme/docs/api/ShallowWrapper/instance.htmlinstance()
peut être appelé sur n'importe quel wrapper enfant s'il a été rendu viamount
.Je l'ai. (version mise à jour / améliorée)
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(); });
la source
mount()
pas de composants dans le DOM. Donc, ils ne peuvent pas recevoir de concentration. Nous devons ajouter un élément DOM et utiliser l'context
option pourmount()
input.prop('value')
Donc beaucoup d'opinions différentes ici. La seule chose qui a fonctionné pour moi n'était rien de ce qui précède, c'était l'utilisation
input.props().value
. J'espère que cela aide.la source
input.prop('value')
si vous connaissez le nom de votre clé prop.J'utilise create-react-app qui est livré avec jest par défaut et enzyme 2.7.0.
Cela a fonctionné pour moi:
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();
la source
Aucun de ces éléments n'a fonctionné pour moi. C'est ce qui a fonctionné pour moi sur Enzyme ^ 3.1.1:
input.instance().props.onChange(({ target: { value: '19:00' } }));
Voici le reste du code pour le contexte:
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);
la source
J'utilise react avec TypeScript et ce qui suit a fonctionné pour moi
wrapper.find('input').getDOMNode<HTMLInputElement>().value = 'Hello'; wrapper.find('input').simulate('change');
Définition directe de la valeur
wrapper.find('input').instance().value = 'Hello'`
me causait un avertissement de compilation.
la source
Cela fonctionne pour moi en utilisant l'enzyme 2.4.1:
const wrapper = mount(<EditableText defaultValue="Hello" />); const input = wrapper.find('input'); console.log(input.node.value);
la source
console.log
un objet et creusais des (sous-) propriétés pour obtenir ce dont j'avais besoin. Ce faisant, j'ai souvent fini par utiliser.node
sous une forme ou une autre, comme vous l'avez fait. Cependant, je ne me souviens pas avoir.node
été mentionné dans la documentation officielle, suggérant que cela pourrait changer / rompre entre les versions car il ne fait pas officiellement partie de l'API annoncée publiquement. En outre, il semble souvent y avoir des alternatives. par exempleinput.node.value
===input.get(0).value
. Donc, cela.node
pourrait fonctionner, et je soupçonne que parfois cela fournira un bon hack, mais à utiliser avec prudence.voici mon 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)
J'ai mis à jour mon DOM avec
componentname.update()
Et puis vérifier la validation du bouton d'envoi (désactiver / activer) avec une longueur de 10 chiffres.la source
Dans mon cas, j'utilisais des rappels de référence,
<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}} >
Pour obtenir la valeur. L'enzyme ne changera donc pas la valeur de this._username.
J'ai donc dû:
login.node._username.value = "[email protected]"; user.simulate('change'); expect(login.state('mailValid')).toBe(true);
Pour pouvoir définir la valeur, appelez change. Et puis affirmer.
la source
Cela a fonctionné pour moi:
let wrapped = mount(<Component />); expect(wrapped.find("input").get(0).props.value).toEqual("something");
la source
Au cas où quelqu'un aurait du mal, j'ai trouvé ce qui suit fonctionnant pour moi
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
Il semble que vous deviez d'abord définir ce qui se passe dans l'événement de changement, puis le simuler (au lieu de simuler l'événement de changement avec des données)
la source
J'ai résolu de manière très simple:
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); });
À votre santé
la source
Aucune des solutions ci-dessus n'a fonctionné pour moi parce que j'utilisais Formik et que j'avais besoin de marquer le champ "touché" avec le changement de la valeur du champ. Le code suivant a fonctionné pour moi.
const emailField = orderPageWrapper.find('input[name="email"]') emailField.simulate('focus') emailField.simulate('change', { target: { value: '[email protected]', name: 'email' } }) emailField.simulate('blur')
la source
J'utilise la méthode setValue [ https://vue-test-utils.vuejs.org/api/wrapper/#setvalue-value] de Wrapper pour définir la valeur.
inputA = wrapper.findAll('input').at(0) inputA.setValue('123456')
la source
.simulate()
ne fonctionne pas pour moi d'une manière ou d'une autre, je l'ai fait fonctionner en accédant simplement aunode.value
sans avoir besoin d'appeler.simulate()
; dans ton cas: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
J'espère que cela aidera les autres!
la source
.node
vous devriez utiliser.instance()
ou.getDOMNode()
, dépend si vous avez utilisé le résultat en tant que ReactElement ou DOMComponent.