La simulation, cliquez sur le document ReactJS/JSDom
Donc je suis en train d'écrire certains tests de code qui ajoute un événement de clic sur le document. Je suis à l'aide de JSDom, ReactJS, et de Moka/Chai de l'installation. J'ai essayé le code suivant dans un test:
document.addEventListener('click', function() {
console.log('test');
});
React.addons.TestUtils.Simulate.click(document);
//also tried React.addons.TestUtils.Simulate.click(document.body);
toutefois, ce code ne produit pas l'écho que j'attends.
Est-il un moyen de simuler le clic, keyup, etc... sur le document avec JSDom et ReactJS?
Mise à JOUR
À Nick réponses, j'ai essayé d'ajouter ce code à l'épreuve:
document.body.addEventListener('click', function() {
console.log('test');
});
document.body.click();
et je n'ai jusqu'à ne recevez pas le journal de la console de sortie. Je ne suis pas sûr si il ya un problème avec JSDom et de faire ce type de chose.
Si je ne peux pas l'unité de tester ce code, c'est très bien, il y a déjà un peu de code que je ne peux pas l'unité de test à l'heure actuelle (code qui nécessite une réelle DOM pour être en mesure d'obtenir les largeurs, hauteurs, etc...), mais je voudrais être en mesure de l'unité de test plus du code (et je ne suis pas intéressé à l'aide de PhantomJS pour les tests unitaires). Mes tests d'intégration permettra de couvrir ce type de code.
UPDATE2
Une autre chose à noter est que est que quand je console.log(document);
je vois objet attaché à la _listeners
propriété pour click
donc je sais que l'événement est attachée, il a juste ne semble pas être en cours d'exécution.
- Avez-vous essayé la même chose dans un navigateur? Fait-il?
- Oui, le code dans le navigateur fonctionne très bien
Vous devez vous connecter pour publier un commentaire.
Mise à jour:
document.body.click
fonctionne dans un navigateur, mais pour jsdom vous devez créer manuellement l'événement:Le code ci-dessus fonctionne pour moi dans la Plaisanterie et devrait travailler avec "en solo" jsdom ainsi.
L'automne 2018 vacances de mise à jour
Les outils autour de la simulation d'événements ont eu beaucoup mieux. Je suis actuellement à changer mon approche à utiliser l'excellent réagir le test de la bibliothèque pour rendre mes composants et de l'expédition des événements:
Alors que je crois encore à la fin à la fin des tests avec quelque chose comme marionnettiste ou le sélénium (ou de cyprès!) de fournir le plus haut niveau de confiance que quelque chose fonctionne réellement, cela fournit une énorme quantité de valeur sans polluer les tests avec le manuel à la création d'événements.
keyCode
propriété de l'instance d'événement avant de vous l'expédier avecinitEvent
keyCode
/which
bien avantinitEvent
fonctionne. Je pense que je vais aller avec ça. Je ne suis pas 100% inquiet qu'il n'est pas vraiment casher depuis que je suis déjà à l'aide de jsdom qui n'est pas vraiment un dom. Je vais avoir des tests d'intégration qui vont à l'encontre de vrais navigateurs, ces tests unitaires sont juste conception pour aider à traiter les problèmes plus tôt avec des tests qui vont courir beaucoup plus vite que les tests d'intégration.event.target
, et en essayant de mettreevt.target = ...
résultats dansTypeError: Cannot set property target of [object Object] which has only a getter
. Toutes les idées sur la façon de joindre untarget
?Réagir.addons.TestUtils.Simuler fonctionne uniquement avec les événements virtuels. Si vous voulez expédition natif d'événements, vous pouvez le faire avec l'api DOM directement.
Lors de la simulation d'un clic, si vous avez un composant qui rend cette:
Et vous avez une référence à la
<button/>
dans une variable appelée 'buttonEl", et d'exécuter ce:Vous obtiendrez une alerte avec 'bonjour le monde' en elle. Tous les test utils n'est de créer l'événement virtuel, et laisser bouillonner le virtuel arborescence dom, appelant les gestionnaires d'événements le long de la voie.
onClick={alert)
Il suffit de créer un
Event
et c'est l'expédition:ReferenceError: MouseEvent is not defined
... qu'est-ce que le JSDOM équivalent?Event.initEvent()
est obsolète et leEvent()
constructeur devrait maintenant être utilisé à la place.Prise en charge du navigateur est bonne à l'exception d'Internet Explorer.
Références: