2016-06-09 20 views

risposta

1

Se si crea un DOM utilizzando jsdom, qualcosa di simile:

import jsdom from 'jsdom'; 
const doc = jsdom.jsdom('<!doctype html><html><body></body></html>'); 
global.document = doc; 
global.window = doc.defaultView; 

quindi è possibile utilizzare degli enzimi di mount() per rendere tutto ciò che si desidera testare.

È quindi possibile valere nei confronti dello stile che stai cercando:

expect(wrapper).to.have.style("display", "none");

+0

Sto usando monto che utilizza jsdom a quanto ho capito, già ma come si otterrebbe nodo DOM del involucro reale in modo da poter utilizzare l'API dom ? per esempio per interrogare className ma * not * usando prop ('className') – njorlsaga

+0

Potrebbe esserci un modo migliore, ma puoi sempre chiamare '.html()' sull'elemento, e poi usare qualcosa come 'DOMParser()': http://stackoverflow.com/questions/3103962/converting-html-string-into-dom-elements – Ryan27

12

Forse siete alla ricerca di enzima di instance()?

const wrapper = mount(<input type="text" defaultValue="hello"/>) 
console.log(wrapper.instance().value); // 'hello' 

PS:

instance() dovrebbe darvi una ReactComponent, da cui è possibile utilizzare ReactDOM.findDOMNode (ReactComponent) per ottenere un DOMNode. Tuttavia, quando ho fatto che, come la seguente, è stato esattamente lo stesso oggetto come wrapper.instance():

import ReactDOM from 'react-dom' 
const wrapper = mount(<input type="text" defaultValue="sup"/>) 
console.log(ReactDOM.findDOMNode(wrapper.instance()) == wrapper.instance()) // true 

Non capisco perché. Se si console.log() uno di quelli, vedrete un HTMLInputElement, ma conterrà un sacco di roba nodo DOM non nativa cercando:

HTMLInputElement { 
    '__reactInternalInstance$yt1y6akr6yldi': 
    ReactDOMComponent { 
    _currentElement: 
     { '$$typeof': Symbol(react.element), 
     type: 'input', 
     key: null, 
     ref: null, 
     props: [Object], 
     _owner: [Object], 
     _store: {} }, 
+0

Quando ho provato la tua tecnica, sembrava funzionare come previsto. In altre parole, 'ReactDOM.findDOMNode (wrapper.instance())! = Wrapper.instance()'. FWIW, sto usando React 15 e Enzyme 2.3.0. – killthrush

+0

Mi chiedo se è perché stavo usando jsdom (o, credo di esserlo, sciocco non ho un permalink per il codice che ho eseguito). Stai usando jsdom? –

+0

Sì, sto usando jsdom 9.1.0 - scusate ho dimenticato di dire che – killthrush

0

mi sono imbattuto in questo stesso problema. Nel mio caso, stavo testando qualcosa costruito con react-aria-modal, che rende il div overlay in una parte diversa del DOM rispetto all'elemento iniziale reso con mount(). Per verificare che questo renda correttamente, avevo bisogno di guardare più globalmente al DOM. Per questo, ho utilizzato l'opzione attachTo di render() per garantire che il mio DOM di test sia come dovrebbe in un browser reale. Here è una buona descrizione generale della tecnica dai documenti.

A seconda di cosa è necessario, è possibile utilizzare l'approccio di Tyler Collier per più parti locali del DOM (findDOMNode utilizzando instance()) o il mio per una vista più globale.

Ecco una specifica campione per il mio caso d'uso, che mostra come installare/uso/teardown il DOM finto:

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') 
    }) 

}) 
10

Sembra che questa funzionalità è stata aggiunta di recente, si può fare wrapper.getDOMNode()

Enzyme docs

Problemi correlati