2017-08-30 206 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