【发布时间】:2014-11-17 05:21:43
【问题描述】:
我正在尝试在 Jasmine 中模拟按键(测试浏览器是 PhantomJS),因此我可以对一些使用按键的功能进行单元测试。不幸的是,我无法使用 Jasmine 正确测试它,因为我遇到了错误。
这是我要测试的代码:
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();
(注意:上面的代码用匿名函数包装了 addEventListener 中的函数,这样 Jasmine 会真正尝试运行我的测试。没有匿名包装,这会导致另一个错误:TypeError: 'undefined' is not a function (evaulating 'this.onKey.bind(this, true)' 解决这个问题也很棒.
)
这是我的测试尝试:
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);
});
});
这会导致 Jasmine 出错:
TypeError: 'undefined' is not a function (evaluating 'pressEvent.initKeyEvent('keydown', true, true, window, false, false, false, false, 0, key)')
我对 Jasmine 还是很陌生(就此而言,Javascript),所以任何一般的帮助将不胜感激。
【问题讨论】:
标签: javascript unit-testing jasmine