2016-05-09 13 views
3

私はmochaとJsDomを使って反応コンポーネントをテストしています。mocha反応のJSDOMテスト、getElementById戻り値

まず、私のコンポーネントは完全に動作するので、テスト環境に問題があります。

状況:

私はidのselectタグのカップルをレンダリングするコンポーネントを持っています。次にdocument.getElementByIdを使用してこれらの選択タグを取得し、オプションを追加するコンポーネントのcomponentDidMount。しかし、私は私のテストを実行すると、これらのnullが表示されますgetElementById

私がcomponentDidMountをコメントアウトし、以下のようなものをアサートすると、それは完全に機能し、コンポーネントはそれらの選択タグをレンダリングしました。

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); 
     [...] 
     }) 
    }) 

何が問題を引き起こしていますか?それは原因ですdocument.getElementByIdドキュメントオブジェクトは私のテスト環境に存在しません私はこれをテストする必要があります私は '偽' 1を使用して原因ですか?以下

モカ

(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; 
     } 

    }()); 

答えて

0

のための私のjsdomセットアップだから、リアクトに取り付けられたDOM要素へのアクセスを得るための標準的な方法は、参考文献を使用することです。代わりに、componentDidMountでdocument.getElementById()を使用する代わりに、要素をレンダリングするときに要素上でref={(element) => { /* Do something with element like this.element = element to save it */ }}を使用します。これは、ドキュメントを参照する必要なく、マウントされたDOM要素で正しいコールバックを取得します。

リアクションコードで可能な限り、ドキュメントの使用は避けるべきです。これは、普遍的なレンダリングを行うことが不可能になるためです。

関連する問題