2016-10-11 46 views
6

Tôi đang cố thử nghiệm thành phần React bằng Jest/Enzyme trong khi sử dụng Webpack.Kiểm tra phản ứng: Vùng chứa đích không phải là phần tử DOM

Tôi có một bài kiểm tra rất đơn giản @

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

import App from './App'; 

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

Các thành phần tương đối nó nhặt được:

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

Tuy nhiên, chạy jest gây ra một thất bại:

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

Có lỗi @

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

Các tập tin kiểm tra tài liệu tham khảo dòng 4, đó là việc nhập khẩu <App />, gây ra một thất bại. Theo dõi stack cho biết dòng 14 của App.js là lý do cho sự thất bại - đó là không có gì hơn gọi render từ react-dom, một cái gì đó tôi đã không bao giờ có một thách thức với (các ứng dụng ám đúng từ thiết lập Webpack của tôi).

Đối với những người quan tâm (Webpack code):

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 tôi:

{ 
    "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" 
    } 
} 

Oh, và nếu có ai sẽ nói rằng phần tử div không được nạp trước tập lệnh, đây là số 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> 

Điều gì có thể là sự cố về vấn đề kết xuất đặc biệt này? Một cái gì đó để làm với một bản cập nhật Jest mới đến 15.0?

Trả lời

12

App.jsx được cho là xuất lớp Ứng dụng và không làm gì hơn, render nên được gọi ở nơi khác.

Nếu bạn xóa cuộc gọi render khỏi lỗi App.jsx sẽ biến mất, nó bật lên vì môi trường thử nghiệm không cung cấp DOM có id app.

+0

tôi gặp lỗi tương tự: - tôi đang thử nghiệm với .. hãy cho tôi biết tôi nên làm gì sai. lớp mặc định xuất khẩu App kéo dài Component { render() { trở lại (

{this.props.children}
) } } render (( ), tài liệu .getElementById ('ứng dụng')); –

+0

@BhavikKheni Vui lòng tạo câu hỏi mới và bao gồm mã hoàn chỉnh của bạn cùng với lỗi và theo dõi ngăn xếp tại đó. – biphobe

11

Đối với bất kỳ ai khác đã lướt qua internet như tôi đã - đang tìm giải pháp cho điều này khi thử nghiệm với Jest - tôi sẽ sao lưu câu trả lời bằng @biphobe bằng cách nói rằng Jest sẽ gây ra lỗi này khi bạn xuất một cái gì đó bên trong cùng một tệp đang gọi ReactDOM.render. Trong trường hợp của tôi, tôi đã có một đối tượng nhỏ mà tôi đang sử dụng để cấu hình một thành phần khác đang được xuất khẩu trong index.js của tôi, nơi tôi cũng đang gọi ReactDOM.render. Tôi đã xóa xuất này và đã được sửa!

+3

Cảm ơn, đó là chính xác những gì tôi đang tìm kiếm. Việc đề cập rõ ràng về việc gọi 'ReactDOM.render()' là chính xác những gì tôi cần để hiểu chính xác vấn đề! – Aaron

+0

Vui vì nó rất hữu ích! –

+0

có vấn đề tương tự khi cố gắng nhập hành động trong thử nghiệm của tôi. Rất tiếc, việc gỡ bỏ ReactDom không giúp được gì –

Các vấn đề liên quan