2016-10-11 36 views
6

Webpackを使用してJest/EnzymeでReactコンポーネントをテストしようとしています。テスト対象:対象コンテナはDOM要素ではありません

私は非常に簡単なテストが

import React from 'react'; 
import { shallow } from 'enzyme'; 

import App from './App'; 

it('App',() => { 
    const app = shallow(<App />); 
    expect(1).toEqual(1); 
}); 

@それが拾っています相対成分があります

import React, { Component } from 'react'; 
import { render } from 'react-dom'; 

// import './styles/normalize.css'; 

class App extends Component { 
    render() { 
    return (
     <div>app</div> 
    ); 
    } 
} 

render(<App />, document.getElementById('app')); 

しかし、jestを実行すると、障害が発生します。

Invariant Violation: _registerComponent(...): Target container is not a DOM element.

エラーあり@

at Object.<anonymous> (src/App.js:14:48) at Object.<anonymous> (src/App.test.js:4:38)

失敗する原因となる<App />の輸入であるテストファイルの参照ライン4、、。スタックトレースは、App.jsの14行目がエラーの原因であると言います。これは、react-domからのレンダリングコール以外何もありません。私がWebpackセットアップから正しくレンダリングしたことはありませんでした。 (WebPACKのコード)興味のある方のために

module.exports = { 
    entry: './src/App', 
    output: { 
    filename: 'bundle.js', 
    path: './dist' 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /\.js?$/, 
     exclude: /node_modules/, 
     loader: 'babel', 
     query: { 
      presets: ['react', 'es2015'] 
     } 
     }, 
     { 
     test: /\.css$/, 
     loader: 'style!css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]' 
     }, 
     { 
     test: /\.scss$/, 
     loader: 'style!css-loader?modules&importLoaders=1&localIdentName=[name]__[local]___[hash:base64:5]!sass' 
     } 
    ] 
    } 
} 

そして、私のpackage.json

{ 
    "name": "tic-tac-dux", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
    "dev": "webpack-dev-server --devtool eval --progress --colors --inline --hot --content-base dist/", 
    "test": "jest" 
    }, 
    "jest": { 
    "moduleNameMapper": { 
     "^.+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__mocks__/fileMock.js", 
     "^.+\\.(css|sass)$": "<rootDir>/__mocks__/styleMock.js" 
    } 
    }, 
    "keywords": [], 
    "author": "", 
    "license": "ISC", 
    "devDependencies": { 
    "babel-core": "^6.17.0", 
    "babel-jest": "^16.0.0", 
    "babel-loader": "^6.2.5", 
    "babel-polyfill": "^6.16.0", 
    "babel-preset-es2015": "^6.16.0", 
    "babel-preset-react": "^6.16.0", 
    "css-loader": "^0.25.0", 
    "enzyme": "^2.4.1", 
    "jest": "^16.0.1", 
    "jest-cli": "^16.0.1", 
    "node-sass": "^3.10.1", 
    "react-addons-test-utils": "^15.3.2", 
    "react-dom": "^15.3.2", 
    "sass-loader": "^4.0.2", 
    "style-loader": "^0.13.1", 
    "webpack": "^1.13.2", 
    "webpack-dev-server": "^1.16.2" 
    }, 
    "dependencies": { 
    "react": "^15.3.2", 
    "react-dom": "^15.3.2" 
    } 
} 

ああ、と誰もがdiv要素は、前にロードされていないことを言おうとしている場合スクリプト、ここに私ですindex.html

<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8"> 
    <title>App</title> 
    </head> 
    <body> 
    <div id="app"></div> 
    <script src="/bundle.js"></script> 
    </body> 
</html> 

この特異なレンダリングの問題はどうですか?新しいJest 15.0のアップデートと何か関係がありますか?

答えて

12

App.jsxは、Appクラスをエクスポートして何もしないことになっています。renderは別の場所で呼び出す必要があります。

App.jsxエラーからrender呼び出しを削除すると、テスト環境でDOMにapp IDが指定されていないため、ポップアップが表示されます。

+0

は、私は同じエラーを得ました エクスポートデフォルトクラスは、アプリ{ レンダリング(){ リターン(

{this.props.children}
) } }コンポーネントを拡張 レンダリング(( <ルータ履歴= {browserHistory}> <ルートパス= "/" コンポーネント= {アプリ}> <ルートパス= "ページ1" 成分= {ページ1} /> <ルートパス= "PAGE2" 成分= {ページ2} /> )、文書.getElementById( 'app')); –

+0

@BhavikKheni新しい質問を作成して、完全なコードをエラーとスタックトレースと共に含めてください。 – biphobe

11

私が行ってきたように、これまでのようにインターネットを使ってコーディネートしていた他の人にとって、Jestでテストするときの解決策を探しています.Jastがこのエラーを発生させると言って@biphobeによる回答をバックアップします。 ReactDOM.renderを呼び出しているファイルの中に何かをエクスポートします。私のケースでは、index.js内でエクスポートされている別のコンポーネントを設定するために使用していた小さなオブジェクトがありました。そこではReactDOM.renderも呼び出していました。私はこの輸出を取り除き、修正されました! 私はAVAでテストしています。.. plsは私に言うどこで間違ったはず... - は:

+3

ありがとう、それはまさに私が探していたものでした。 'ReactDOM.render()'を呼び出すことについての明示的な言及は、私が正確な問題を理解するために必要なものでした! – Aaron

+0

うれしかったことはうれしい! –

+0

私のテストでアクションをインポートしようとしたときに同様の問題が発生しました。残念ながら、ReactDomを削除しても役立たない –

関連する問題