les tests les événements keydown dans le Jasmin avec un mot de code spécifique
Je suis en train d'écrire des tests pour un AngularJS directive qui déclenche les événements d'un <textarea>
lorsque certaines touches sont pressées. Tout cela fonctionne très bien pour mon test manuel. Je veux être bien et d'avoir un système complet de test de la suite de trop, mais j'ai un problème que je ne peux pas résoudre sur mon propre:
Je veux envoyer un keyCode
dans mon triggerHandler()
appel dans mon test, mais je ne peux pas trouver un moyen de spécifier la clé qui fonctionne réellement. Je suis conscient d'un beaucoup de questions et de réponses sur le sujet de la construction et de l'envoi d'événements avec des données précises, mais aucun d'eux ne fonctionne sur ma configuration:
Ma configuration
- Karma test runner
- PhantomJS navigateur en cours d'exécution des tests (mais également essayé Firefox et google Chrome sans succès)
- Je ne suis pas à l'aide de jQuery et je suis l'espoir, il y a une JS solution. Il doit y être!
Code de Test
var event = document.createEvent("Events");
event.initEvent("keydown", true, true);
event.keyCode = 40; //in debugging the test in Firefox, the event object can be seen to have no "keyCode" property even after this step
textarea.triggerHandler(event); //my keydown handler does not fire
La chose étrange est, je peux taper les 3 premières lignes dans la console de Chrome et de voir que l'événement est en cours de création avec la keyCode
propriété a la valeur de 40.
Donc il semble que cela devrait fonctionner.
Aussi, quand je l'appelle de la dernière ligne comme ce textarea.triggerHandler("keydown");
il fonctionne et le gestionnaire d'événement est déclenché. Cependant, il n'est pas keyCode
à travailler, c'est inutile.
Je soupçonne que c'est peut être quelque chose à voir avec la nature de l'essai en cours d'exécution contre un DOM qui est différent d'une page régulière en cours d'exécution dans le navigateur. Mais je ne peux pas la comprendre!
Bonjour, cette discussion est précisément à propos de jQuery, je ne suis pas à l'aide. J'espère que je n'ai pas besoin d'inclure jQuery dans mes tests unitaires juste pour cela.
Je pense que j'ai déjà répondu à cette pure JS, mais apparemment, cette question a été supprimé. Vous devriez être capable de trouver plus d'info sur MDN.
Dans d'autres [thread][1] j'ai ajouté réponse et décrit comment tester keydown. [1]: stackoverflow.com/questions/18001169/...
OriginalL'auteur Michael Bromley | 2014-03-22
Vous devez vous connecter pour publier un commentaire.
J'ai utilisé la solution suivante pour tester et avoir de travail en Chrome, FF, PhantomJS et IE9+ basé sur ce DONC réponse.
Il ne fonctionne pas en Safari essayé des millions d'autres solution, sans succès...
Espère que cela aide
Mise à jour
Aujourd'hui j'ai trouvé et testé cette solution qui offre une plus large couverture des navigateurs (permettant la prise en charge héritée):
https://gist.github.com/termi/4654819
Tout le crédit revient à l'auteur de ce RÉSUMÉ.
Le code prend en charge Safari, PhantomJS et IE9 - testé pour la première 2.
element.triggerHandler()
méthode, et il fonctionne bien. J'avais renoncé à celui-ci; je suis maintenant occupé à finir mon test de suite!vous êtes à l'aide de PhantomJS? Je reçois un message d'erreur que le mot de code est mal adapté.
Même ici. Une sorte ce problème ?
Juste mis à jour avec une meilleure solution qui couvre Safari et PhantomJS.
Liés code ne fonctionne pas dans PhantomJS 1.9.8.
TypeError: 'undefined' is not a function (evaluating 'Function.prototype.call.bind(Object.prototype.hasOwnProperty)')
OriginalL'auteur
L'ajout de @MarcoL réponse, je tiens à souligner pour les futurs lecteurs qui pourraient tomber sur cette question, que les méthodes
initKeyboardEvent
etinitKeyEvent
sont des méthodes obsolètes et ne doivent plus être utilisés. Voir ici et ici.Au lieu que le MDN docs suggéré, les événements doivent être créées par le biais de leurs respectifs constructeur.
OriginalL'auteur