Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 测试中未正确传递自定义事件参数_Javascript_Unit Testing_Testing_Jestjs - Fatal编程技术网

Javascript 测试中未正确传递自定义事件参数

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

我开发了一个JavaScript库来处理gamepad/操纵杆生成的事件,还为不同的测试用例开发了一系列Jest测试。但是我在测试中遇到了一个问题:我不知道如何模拟
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]}