2017-08-30 170 views
1

在我做出反应的代码,我听一个FocusEvent,并正被聚焦的元素的类型进行检查:我该如何模拟`instanceof`测试?

function onBlur(event) { 
    if(event.relatedTarget instanceof HTMLInputElement) { /* ... */ } 
} 

这工作得很好。我似乎就是无法虽然为它编写一个适当的单元测试...我想我能够调用的方法onBlur如下:

onBlur({ relatedTarget: new HTMLInputElement() }); 

...但不幸的是,这导致一个错误:

TypeError: Illegal constructor 

我使用Jest和酵素(我认为使用jsdom?),如果那很重要。

如何最好地解决这个问题?

回答

1

使用这个,你可以嘲笑你的元素:

var a = document.createElement('input') 
a instanceof HTMLInputElement // returns true 

如果您需要添加更多的行为,那么你可以将其添加到一个对象。

+0

其实我想通了,我能做到这一点(对不起 - 橡胶鸭调试不工作),一旦我意识到,'jsdom'是可用的。谢谢您的帮助! – Vincent

+0

@Vincent,请考虑接受答案,如果它有助于解决您的问题 – eddyP23

+0

但是哪一个?他们都是等价的,我不想通过简单地接受22年前的答案来为回答老鼠赛跑做出贡献... – Vincent

1

这将计算为true

document.createElement('input') instanceof HTMLInputElement 
+0

我发现我可以做到这一点(抱歉 - 橡皮鸭调试确实有效),一旦我意识到'jsdom'可用。谢谢您的帮助! – Vincent

0

还有一个方法是改变测试你输入元素的方式。您可以使用tagName这应该是“输入”字符串:

function onBlur(event) { 
    if(event.relatedTarget.tagName === 'INPUT') { /* ... */ } 
} 

onBlur({ relatedTarget: {tagName: 'INPUT'} }); 
+0

问题是'relatedTarget'可能会是'null',这就是为什么我想检查它(TypeScript是否有用的抱怨:)。 – Vincent