Simulate keydown on document for JEST unit testing

女生的网名这么多〃 提交于 2019-12-09 02:51:45

问题


Using JEST to unit test a component that has a keydown listener attached to the document.

How can I test this in JEST? How do I simulate the keydown event on the document? I need the event listener to be on the document since it is supposed to respond the keyboard action irrespective of the focussed element.

EDIT: The question here is about simulating the event on the document or the document.body. All the examples are regarding an actual DOM node, that works fine but the document does not.

Currently trying to do this:

TestUtils.Simulate.keyDown(document, {keyCode : 37}); // handler not invoked

回答1:


I had the exact same problem and unfortunately couldn't find any details on how to solve this using TestUtils.Simulate. However this issue gave me the idea of simply calling .dispatchEvent with a KeyboardEvent inside my jest tests directly:

var event = new KeyboardEvent('keydown', {'keyCode': 37});
document.dispatchEvent(event);

You can find details on the KeyboardEvent here: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent




回答2:


You can also replace the whole document.eventListener with mock function before you mount the component:

let events;
document.addEventListener = jest.fn((event, cb) => {
  events[event] = cb;
});

And simulate event by calling events[event] after mounting, e.g.:

events.keydown({ keyCode: 37 })

Also, it's quite comfortable to do first part in beforeEach() function if you have many tests dealing with DOM events.



来源:https://stackoverflow.com/questions/33638385/simulate-keydown-on-document-for-jest-unit-testing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!