![](/img/trans.png)
[英]How do I find the React DOM node that represents its actual html element?
[英]how to check the actual DOM node using react enzyme
有沒有辦法獲取實際的 DOM 節點,以便我可以使用 Dom api 查詢它,而不是需要使用酶的 api,這僅適用於邊緣情況,例如我需要斷言有關 dom 節點本身的事情。
您可以使用wrapper.getDOMNode()
也許您正在尋找酶的instance() ?
const wrapper = mount(<input type="text" defaultValue="hello"/>)
console.log(wrapper.instance().value); // 'hello'
PS:
instance()
應該給你一個ReactComponent
,你可以從中使用 ReactDOM.findDOMNode(ReactComponent) 來獲取一個 DOMNode。 但是,當我這樣做時,如下所示,它與wrapper.instance()
是完全相同的對象:
import ReactDOM from 'react-dom'
const wrapper = mount(<input type="text" defaultValue="sup"/>)
console.log(ReactDOM.findDOMNode(wrapper.instance()) == wrapper.instance()) // true
我不明白為什么會這樣。 如果你使用console.log()
任何一個,你會看到一個HTMLInputElement
,但它會包含許多非本地 DOM 節點的東西:
HTMLInputElement {
'__reactInternalInstance$yt1y6akr6yldi':
ReactDOMComponent {
_currentElement:
{ '$$typeof': Symbol(react.element),
type: 'input',
key: null,
ref: null,
props: [Object],
_owner: [Object],
_store: {} },
我遇到了同樣的問題。 就我而言,我正在測試用react-aria-modal
構建的東西,它在 DOM 的不同部分呈現覆蓋 div,而不是用mount()
呈現的初始元素。 為了測試這是否正確呈現,我需要更全面地查看 DOM。 為此,我使用了render()
的attachTo
選項來確保我的測試 DOM 在真實瀏覽器中看起來應該是這樣。 這是文檔中對該技術的很好的一般描述。
根據您的需要,您可以將 Tyler Collier 的方法用於 DOM 的更多本地部分( findDOMNode
使用instance()
)或我的方法以獲得更全局的視圖。
這是我的用例的示例規范,展示了如何設置/使用/拆卸模擬 DOM:
import MyModalComponent from '../components/my-modal-component'
import React from 'react'
import { jsdom } from 'jsdom'
import { mount } from 'enzyme'
describe('<MyModalComponent /> Component', function(){
let wrapper
beforeEach(function(){
window.document = jsdom('')
document.body.appendChild(document.createElement('div'))
})
afterEach(function(){
wrapper.detach()
window.document = jsdom('')
})
it('renders the modal closed by default', () => {
wrapper = mount(
<MyModalComponent prop1={"foo"}
prop2={"bar"}
/>, { attachTo: document.body.firstChild }
)
expect(wrapper.html()).to.contain('Content in component')
expect(document.body.innerHTML).to.not.contain('Content in overlay')
})
})
如果您使用 jsdom 創建 DOM,則如下所示:
import jsdom from 'jsdom';
const doc = jsdom.jsdom('<!doctype html><html><body></body></html>');
global.document = doc;
global.window = doc.defaultView;
然后你可以使用酶的mount()來渲染你想要測試的任何東西。
然后,您可以針對您正在尋找的樣式進行斷言:
expect(wrapper).to.have.style("display", "none");
你可以使用類似的東西:
const dialog = component.find(Modal);
let modal = dialog.node._modal;
modal.getDialogElement().querySelector('#saveBtn')
基於 react-bootstrap 網站中 Modal 的測試
https://github.com/react-bootstrap/react-bootstrap/blob/master/test/ModalSpec.js
如果你想打印整個 DOM,
const wrapper = shallow(<MyComponent/>);
console.log("DOM tree for humans", wrapper.text());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.