Simuler de faux pression de touche de jasmin
Je suis en train de simuler une touche de Jasmin (le test de navigateur est PhantomJS) afin que je puisse unité de tester quelques-uns de mes fonctions qui utilisent des touches. Malheureusement, je ne peux pas le tester correctement avec Jasmine parce que j'ai des erreurs.
Voici le code, je suis en train de tester:
function Controls() {
'use strict';
this.codes = {
37: 'left',
39: 'right',
38: 'forward',
40: 'backward'
};
this.states = {
'left': false,
'right': false,
'forward': false,
'backward': false
};
document.addEventListener('keydown', function() { this.onKey.bind(this, true); }, false);
document.addEventListener('keyup', function() { this.onKey.bind(this, false); }, false);
}
Controls.prototype.onKey = function(val, e) {
var state = this.codes[e.keyCode];
if (typeof state === 'undefined') return false;
this.states[state] = val;
//Stop the key press from repeating
e.preventDefault();
e.stopPropagation();
return true;
};
controls = new Controls();
(NOTE: Le code ci-dessus encapsule les fonctions de la méthode addEventListener avec anon, de sorte que Jasmine va réellement essayer de l'exécuter mes tests. Sans l'anonyme wrap, cette résultats dans une autre erreur: TypeError: 'undefined' is not a function (evaulating 'this.onKey.bind(this, true)'
la Résolution de ce problème serait trop grand.
)
Et c'est ma tentative de test:
function keyPress(key) {
var pressEvent = document.createEvent('KeyboardEvent');
pressEvent.initKeyEvent('keydown', true, true, window,
false, false, false, false,
0, key);
document.dispatchEvent(pressEvent);
}
describe("Controls", function() {
var controls;
it("should initialize properly", function() {
controls = new Controls();
expect(controls).not.toBe(null);
});
it("should reflect changes in state when arrow keys are used", function() {
keyPress(37);
expect(controls.states[state]).toBe(37);
});
});
Il en résulte une erreur de Jasmine:
TypeError: 'undefined' is not a function (evaluating 'pressEvent.initKeyEvent('keydown', true, true, window, false, false, false, false, 0, key)')
Je suis encore très nouveau à Jasmine (et d'ailleurs, Javascript), de sorte que toute aide en général serait appréciée.
OriginalL'auteur emmabukacek | 2014-11-17
Vous devez vous connecter pour publier un commentaire.
Il ressemble à votre problème est que vous êtes la création de votre événement.
L'exemple de code ci-dessous montre comment un événement est créé, déclenché, et intercepté.
Voici un plunker trop: http://plnkr.co/edit/TxGXcT0DnPa44C0PkHkN?p=preview
Comme commenté, voir ici pour plus d'informations concernant .keyCode autodérision.
Salut, C'est un vieux post, mais il peut bon de savoir que le
keyCode
est maintenant obsolète voir le MDN article. Ainsi, le code doit utiliserkey
oucode
et donc être légèrement différents.J'ai édité cette réponse, avec une édition de la nouvelle
event.key
au lieu deevent.keycode
OriginalL'auteur Chris
EDIT: Ce problème doit être résolu que de PhantomJS 2. Plus d'informations dans la question ci-dessous.
Donc, la raison
était de retourner une erreur est parce que de la date de ce post, PhantomJS ne prend pas en charge les lie encore. Vous pouvez trouver plus d'informations à ce sujet ici:
https://github.com/ariya/phantomjs/issues/10522
et une plus longue explication de ariya ici:
https://groups.google.com/forum/#!msg/phantomjs/r0hPOmnCUpc/uxusqsl2LNoJ
Un moyen de contourner ce problème est de créer un polyfill comme suggéré par creationix:
https://github.com/c9/smith/blob/master/tests/public/test.js#L2-L7
Compte tenu de toutes ces informations, il devrait faire des tests un peu plus faciles à gérer, sachant que je peux contourner le prototype en question. Merci pour toute l'aide que!
OriginalL'auteur emmabukacek