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