我如何模拟“instanceof”测试?
How can I mock an `instanceof` test?
在我的 React 代码中,我侦听 FocusEvent,并检查正在聚焦的元素的类型:
function onBlur(event) {
if(event.relatedTarget instanceof HTMLInputElement) { /* ... */ }
}
这很好用。我只是似乎无法为它编写适当的单元测试......我想我可以按如下方式调用 onBlur
方法:
onBlur({ relatedTarget: new HTMLInputElement() });
...但不幸的是,这会导致错误:
TypeError: Illegal constructor
如果重要的话,我正在使用 Jest 和 Enzyme(我认为它使用 jsdom?)。
如何最好地解决这个问题?
使用这个你可以模拟你的元素:
var a = document.createElement('input')
a instanceof HTMLInputElement // returns true
如果您需要添加更多行为,那么您可以将其添加到对象 a 中。
这将计算为 true
:
document.createElement('input') instanceof HTMLInputElement
另一种方法是更改测试输入元素的方式。您可以使用 tagName
应该是 'INPUT' string:
function onBlur(event) {
if(event.relatedTarget.tagName === 'INPUT') { /* ... */ }
}
onBlur({ relatedTarget: {tagName: 'INPUT'} });
在我的 React 代码中,我侦听 FocusEvent,并检查正在聚焦的元素的类型:
function onBlur(event) {
if(event.relatedTarget instanceof HTMLInputElement) { /* ... */ }
}
这很好用。我只是似乎无法为它编写适当的单元测试......我想我可以按如下方式调用 onBlur
方法:
onBlur({ relatedTarget: new HTMLInputElement() });
...但不幸的是,这会导致错误:
TypeError: Illegal constructor
如果重要的话,我正在使用 Jest 和 Enzyme(我认为它使用 jsdom?)。
如何最好地解决这个问题?
使用这个你可以模拟你的元素:
var a = document.createElement('input')
a instanceof HTMLInputElement // returns true
如果您需要添加更多行为,那么您可以将其添加到对象 a 中。
这将计算为 true
:
document.createElement('input') instanceof HTMLInputElement
另一种方法是更改测试输入元素的方式。您可以使用 tagName
应该是 'INPUT' string:
function onBlur(event) {
if(event.relatedTarget.tagName === 'INPUT') { /* ... */ }
}
onBlur({ relatedTarget: {tagName: 'INPUT'} });