Tôi đang cố gắng mô phỏng một phím bấm trong Jasmine (trình duyệt thử nghiệm là PhantomJS) để tôi có thể kiểm tra một số chức năng của tôi sử dụng các lần nhấn phím. Thật không may, tôi không thể kiểm tra nó đúng với Jasmine vì tôi gặp lỗi.Giả lập bấm phím giả trong hoa nhài
Dưới đây là đoạn code tôi đang cố gắng để kiểm tra:
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();
(Chú ý: Đoạn mã trên kết thúc tốt đẹp các chức năng trong addEventListener với các chức năng anon để Jasmine sẽ thực sự cố gắng để chạy thử nghiệm của tôi Nếu không có sự nặc danh. bọc, điều này dẫn đến lỗi khác: TypeError: 'undefined' is not a function (evaulating 'this.onKey.bind(this, true)'
Giải quyết vấn đề này sẽ là tuyệt vời quá )
Và đây là nỗ lực của tôi lúc kiểm tra:.
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);
});
});
Điều này dẫn đến một lỗi từ Jasmine:
TypeError: 'undefined' is not a function (evaluating 'pressEvent.initKeyEvent('keydown', true, true, window, false, false, false, false, 0, key)')
Tôi vẫn còn rất mới để Jasmine (và cho rằng vấn đề, Javascript), vì vậy bất kỳ sự giúp đỡ nói chung sẽ được đánh giá.
Bởi vì điều này giải quyết được vấn đề thực tế trong tầm tay, tôi chấp nhận câu trả lời này; cảm ơn Chris! Tuy nhiên, câu hỏi ban đầu của tôi không thực sự là điều tôi nên hỏi, vì vậy tôi sẽ cung cấp thêm chi tiết về điều này bên dưới. – emmabukacek
Xin chào, Đây là bài đăng cũ nhưng có thể bạn biết rằng '' 'mã khóa''' hiện không còn được dùng nữa [xem bài viết MDN] (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode). Vì vậy, mã nên sử dụng '' 'key''' hoặc' '' code''' và do đó hơi khác nhau. – ollie314