Reactjs中的测试窗口keydown事件
Test window keydown event in Reactjs
我正在编写的组件需要根据是否按下ctrl来更改其行为。
我使用window.onkeydown
事件,但React Test Utils中的Simulate
不允许我针对window
调度事件。我也尝试过window.dispatchEvent(new KeyboardEvent('keydown', { keyCode: 17 }));
,但摩卡/节点无法识别KeyboardEvent
。
有没有一种方法可以使用React test Utils测试window.onkeydown
?如果没有,在node的mocha中有更好的方法吗?
这里有一些代码来解决这个问题:
describe('On Keydown', () => {
it('fires the event', () => {
// Component
const Component = class extends React.Component {
constructor(props) {
super(props);
this.state = { key: false };
window.addEventListener('keydown', e => this.setState({ key: true }));
window.addEventListener('keyup', e => this.setState({ key: false }));
}
render() {
return <span>test</span>
};
};
// Rendering
const rendered = renderIntoDocument(<Component/>);
// Firing event
expect(rendered.state.key).to.equal(false);
// Error here
Simulate.keyDown(window, { keyCode: 17 });
expect(rendered.state.key).to.equal(true);
});
});
如果像window.addEventListener('keydown', myFunc)
那样设置侦听器,则只需要测试myFunc
,而实际上不需要测试当keydown
发生时addEventListener
调用您的函数。
通过始终将事件绑定到函数(而不是在回调中进行工作(,测试更直接(您正在测试您的代码(,而且您还可以在完成事件侦听器后删除它们。
由于David的评论,我忽略了该事件并将状态设置为测试所需的状态,从而解决了这个问题。我还找到了一种不同的方法来测试将来的窗口事件。创建一个扩展EventEmitter的窗口类,您可以通过window.emit('keydown',{keyCode: 17})
接收keydown/keyup事件,如ctrl。
这是我的_test_help.js:的代码
import jsdom from 'jsdom';
import chai from 'chai';
import EventEmitter from 'events';
const doc = jsdom.jsdom('<!doctype html><html><body></body></html>');
const windowClass = class extends EventEmitter {
constructor() {
super(doc.defaultView);
this.__defineSetter__('onkeydown', f => this.on('keydown', f));
this.__defineSetter__('onkeyup', f => this.on('keyup', f));
}
addEventListener (e,f) {
this.on(e,f);
}
};
const win = new windowClass();
global.document = doc;
global.window = win;
Object.keys(window).forEach((key) => {
if (!(key in global)) {
global[key] = window[key];
}
});
相关文章:
- 阻止浏览器对keydown事件作出反应,但不取消该事件
- IE9-添加和删除DOM元素会破坏父keydown事件
- 在文本区域禁用javascript定义的keydown事件并恢复默认行为
- 在Chrome中模拟keydown事件
- 使用Keydown事件移动对象
- 如何在不干扰网站其他部分的情况下,在画布上捕捉keydown事件
- HTML jQuery 函数在 Keydown 事件上不起作用
- 输入字段未使用 ng-keydown 事件更新
- angularjs的ng keydown事件,按下哪个键的值,然后显示按下的键的值
- background.js正在捕获textbox的keydown事件
- 当我更新HTML时,Keydown事件停止触发
- 为什么我的引导工具提示的标题只会随着jQuery中的keydown事件而更改一次
- 使用AngularJS对超快速keyup和keydown事件调用函数
- d3:拦截特定元素上的keydown事件
- Javascript ActiveElement和Keydown事件侦听器
- 在Firefox中的keydown事件中隐藏元素时焦点顺序错误
- Javascript 'keydown' 事件侦听器不起作用
- 同时在 JavaScript 中使用 keyup/keydown 事件
- 如何使用 Keydown 事件在多种语言/键盘布局中获取正确的字符
- 触发警报的JS(Jquery).keydown事件