2016-05-09 21 views
3

Ich benutze Mocha und JsDom, um meine Reaktionskomponente zu testen.mokka JSDOM testing auf react, getElementById return null

Zunächst funktioniert meine Komponente perfekt, also ist es ein Problem mit der Testumgebung.

Situation:

Ich habe eine Komponente, die ein paar select Tag mit id machen. Dann eine componentDidMount in der Komponente, die document.getElementById verwenden würde, um diese ausgewählten Tags zu erhalten und ihnen Optionen hinzuzufügen. Aber wenn ich meinen Test starte, zeigt er Null für diese getElementById.

Jetzt, wenn ich componentDidMount auskommentieren, und Zeug wie unten behaupten, es funktioniert perfekt, so dass die Komponente diese Auswahl Tags rendern.

describe('test component', function(){ 
     var renderedElement = ReactTestUtils.renderIntoDocument(<Component/>); 
     var renderedNode = ReactDom.findDOMNode(renderedElement); 
     it('should have the proper markup', function(){ 
     assert.equal(renderedNode.childElementCount, 5); 
     [...] 
     }) 
    }) 

Was verursacht das Problem? Ist es Ursache document.getElementById das Dokument-Objekt existiert nicht in meiner Testumgebung, weil ich eine "Fälschung" verwende, wenn ja, wie soll ich das testen?

unten ist mein jsdom Setup für Mokka

(function() { 
     'use strict'; 

     var jsdom = require('jsdom'), 
      baseHTML, 
      window; 

     if (!global.window) { 
      baseHTML = '<!DOCTYPE html><html><head lang="en"><meta charset="UTF-8"><title>Tests</title></head><body></body></html>'; 
      window = jsdom.jsdom(baseHTML).defaultView; 

      global.window = window; 
      global.document = window.document; 
      global.navigator = window.navigator; 
     } 

    }()); 

Antwort

0

also die kanonische Weise Zugriff auf die montierten DOM Komponente zu erhalten in Reaktion ist ein ref zu verwenden. Verwenden Sie anstelle von document.getElementById() in Ihrem componentDidMount stattdessen ref={(element) => { /* Do something with element like this.element = element to save it */ }} für das Element, während Sie es rendern. Dies wird einen korrekten Rückruf mit dem angehängten DOM-Element erhalten, ohne dass ein Dokument referenziert werden muss.

Die Verwendung des Dokuments sollte möglichst in React-Code vermieden werden, da es das universelle Rendering unmöglich macht.