Javascript 测试中未正确传递自定义事件参数
我开发了一个JavaScript库来处理gamepad/操纵杆生成的事件,还为不同的测试用例开发了一系列Jest测试。但是我在测试中遇到了一个问题:我不知道如何模拟Javascript 测试中未正确传递自定义事件参数,javascript,unit-testing,testing,jestjs,Javascript,Unit Testing,Testing,Jestjs,我开发了一个JavaScript库来处理gamepad/操纵杆生成的事件,还为不同的测试用例开发了一系列Jest测试。但是我在测试中遇到了一个问题:我不知道如何模拟gamepadconnected和gamepadisconnected事件 这是我的代码的简化版本: const gameControl = { // ... init: function() { window.addEventListener('gamepadconnected', e => { c
gamepadconnected
和gamepadisconnected
事件
这是我的代码的简化版本:
const gameControl = {
// ...
init: function() {
window.addEventListener('gamepadconnected', e => {
console.log('gamepad detected');
if (!window.gamepads) window.gamepads = {};
if (e.gamepad) {
if (!window.gamepads[e.gamepad.index]) {
window.gamepads[e.gamepad.index] = e.gamepad;
// ...
}
}
});
window.addEventListener('gamepaddisconnected', e => {
console.log('gamepad disconnected');
if (e.gamepad) {
delete window.gamepads[e.gamepad.index];
// ...
}
});
}
// ...
};
gameControl.init();
export default gameControl;
gamepadconnected
和gamepadisconnected
分别是连接或断开gamepad/操纵杆时触发的本机事件。作为参数,它们接收一个带有gamepad
属性的事件对象,该对象包含有关已连接/断开连接的gamepad的信息
我尝试在测试中手动调度事件,(gamepad
下面是一个包含gamepad模拟数据的数组)。大概是这样的:
describe('gameControl', () => {
// ...
test('trigger gamepadconnected event', () => {
const event = new CustomEvent('gamepadconnected', {
detail: { gamepad: gamepads[0] }
});
global.dispatchEvent(event);
});
test('trigger gamepaddisconnected event', () => {
const event = new CustomEvent('gamepaddisconnected', {
detail: { gamepad: gamepads[0] }
});
global.dispatchEvent(event);
});
// ...
});
但是,尽管事件被正确调度并且事件侦听器被触发,但参数无法通过。例如,gamepadconnected
被处理,我在控制台中看到“检测到gamepad”,但对象e
不包含我需要的属性gamepad
我做了一个console.log(e)
来查看事件对象的属性,但是我的参数不见了。这是控制台的全部内容。日志显示:
CustomEvent{isTrusted:[Getter]}
我做错了什么?如何实现我想要的并测试gamepadconnected
和gamepadisconnected
的事件处理程序的完整代码
作为替代方案,我尝试将gamepad
属性移动到顶层,或者使用Event
而不是CustomEvent
,但问题仍然存在
test('trigger gamepaddisconnected event', () => {
const event = new CustomEvent('gamepaddisconnected', {
gamepad: gamepads[0]
});
global.dispatchEvent(event);
});
test('trigger gamepaddisconnected event', () => {
const event = new Event('gamepaddisconnected', {
gamepad: gamepads[0]
});
global.dispatchEvent(event);
});
我想到了一个懒惰的黑客:只需检查是否定义了e.detail.gamepad,然后将e.gamepad设置为e.detail.gamepad
window.addEventListener('gamepadconnected', e => {
if(e.detail && e.detail.gamepad) { e.gamepad = e.detail.gamepad }
...
这与我最终的想法类似(
const egp=e.gamepad | | e.detail.gamepad
)。它是有效的,但正如你所说,它是一个黑客。我正在更改库/应用程序代码以使其适应测试代码,但这并不理想。是的。。。但最终您获得了对“模拟游戏板”的支持;-)我也经历过这种情况。我正在使用jest测试库。当我从测试文件中的src文件和事件监听器发送CustomEvent时,我可以看到eventdetails对象。当我从测试文件中分派CustomEvent时,我的src文件中包含事件侦听器,细节对象不在那里,当console.logging为:CustomEvent{isTrusted:[Getter]}