2016-06-08 3 views
3

В настоящее время у меня проблема, когда я пытаюсь добавить простой модульный тест с помощью шутки. И он продолжает бросать TypeError: Component не является функциональной ошибкой, и я не могу ее исправить. У кого-то была такая же ошибка, или у кого-нибудь есть идеи о том, как ее исправить? Действительно ценю это!React Native jest keep throwing -TypeError: Компонент не является функцией ошибки

теста результат я получил от шутки выглядит следующим образом:

Using Jest CLI v11.0.2, jasmine2, babel-jest 
Running 1 test suite...Warning: React.createElement: type should not be null, undefined, boolean, or number. It should be a string (for DOM elements) or a ReactClass (for composite components). 
FAIL app/views/connections/__tests__/Connections-test.js (3.217s) 
Connections 
    ✕ it should return View 

Connections › it should return View 
    - TypeError: Component is not a function 
     at ShallowComponentWrapper._constructComponentWithoutOwner (node_modules/react/lib/ReactCompositeComponent.js:250:8) 
     at ShallowComponentWrapper.mountComponent (node_modules/react/lib/ReactCompositeComponent.js:159:15) 
     at ShallowComponentWrapper.wrapper [as mountComponent] (node_modules/react/lib/ReactPerf.js:66:13) 
     at ReactShallowRenderer._render (node_modules/react/lib/ReactTestUtils.js:385:10) 
     at _batchedRender (node_modules/react/lib/ReactTestUtils.js:366:10) 
     at ReactDefaultBatchingStrategyTransaction.perform (node_modules/react/lib/Transaction.js:136:12) 
     at Object.batchedUpdates (node_modules/react/lib/ReactDefaultBatchingStrategy.js:63:13) 
     at Object.batchedUpdates (node_modules/react/lib/ReactUpdates.js:97:18) 
     at ReactShallowRenderer.render (node_modules/react/lib/ReactTestUtils.js:359:14) 
     at renderConnections (app/views/connections/__tests__/Connections-test.js:17:10) 
     at Object.eval (app/views/connections/__tests__/Connections-test.js:25:12) 
1 test failed, 0 tests passed (1 total in 1 test suite, run time 9.326s) 
--------------------|----------|----------|----------|----------|----------------| 
File    | % Stmts | % Branch | % Funcs | % Lines |Uncovered Lines | 
--------------------|----------|----------|----------|----------|----------------| 
__mocks__/   | 78.33 | 48.15 | 46.15 |  100 |    | 
    react-native.js | 78.33 | 48.15 | 46.15 |  100 |    | 
views/connections/ | 88.89 |  75 |  50 |  80 |    | 
    Connections.js | 88.89 |  75 |  50 |  80 |    9 | 
--------------------|----------|----------|----------|----------|----------------| 
All files   | 79.71 | 51.61 | 46.67 | 96.15 |    | 
--------------------|----------|----------|----------|----------|----------------| 

Компонент Я хочу проверить, как следующие:

import React, { PropTypes } from 'react'; 
import { 
    View, 
    Text, 
} from 'react-native'; 

const Connections = React.createClass({ 
    render() { 
    return (
     <View> 
     <Text> 
      Connections Page 
     </Text> 
     </View> 
    ) 
    } 
}) 

export default Connections 

И мой package.json, как следующее:

{ 
    "name": "someProject", 
    "version": "0.0.6", 
    "private": true, 
    "scripts": { 
     "start": "node node_modules/react-native/local-cli/cli.js start", 
     "test_legacy": "mocha --comilers js:babel-core/register --recursive ./test/units/*.js --require ./test/setup.js", 
     "test": "rm -rf ./node_modules/jest-cli/.haste_cache && jest --no-cache", 
     "build-prd": "cd android && ./gradlew installRelease", 
     "clean-install": "rm -r -f node_modules && npm install" 
    }, 
    "dependencies": { 
     "axios": "^0.11.0", 
     "install": "^0.7.3", 
     "moment": "^2.13.0", 
     "npm": "^3.8.9", 
     "react": "15.0.2", 
     "react-native": "^0.26.2", 
     "react-native-animatable": "^0.6.0", 
     "react-native-billing": "^1.3.0", 
     "react-native-button": "^1.5.0", 
     "react-native-carousel": "^0.8.0", 
     "react-native-device-info": "^0.9.3", 
     "react-native-dismiss-keyboard": "^1.0.0", 
     "react-native-drawer": "^2.2.0", 
     "react-native-gifted-spinner": "0.0.4", 
     "react-native-i18n": "0.0.8", 
     "react-native-linear-gradient": "^1.5.9", 
     "react-native-modalbox": "^1.3.3", 
     "react-native-push-notification": "^1.0.6", 
     "react-native-router-flux": "^3.26.0", 
     "react-native-scrollable-tab-view": "^0.4.2", 
     "react-native-swipeout": "^2.0.12", 
     "react-native-swiper": "^1.4.4", 
     "react-native-vector-icons": "^2.0.2", 
     "react-redux": "^4.4.5", 
     "realm": "^0.12.0", 
     "redux": "^3.5.2", 
     "redux-logger": "^2.6.1", 
     "redux-promise": "^0.5.3", 
     "redux-thunk": "^2.0.1", 
     "socket.io-client": "^1.3.5" 
    }, 
    "devDependencies": { 
     "babel": "^6.5.2", 
     "babel-core": "^6.9.0", 
     "babel-jest": "^12.1.0", 
     "babel-polyfill": "^6.9.1", 
     "babel-preset-airbnb": "^1.0.1", 
     "babel-preset-es2015": "^6.9.0", 
     "babel-preset-react": "^6.5.0", 
     "babel-preset-react-native": "^1.9.0", 
     "babel-preset-stage-0": "^6.5.0", 
     "chai": "^3.5.0", 
     "enzyme": "^2.3.0", 
     "jest-cli": "11.0.2", 
     "mocha": "^2.4.5", 
     "react-addons-test-utils": "15.0.2", 
     "react-dom": "15.0.2" 
    }, 
    "jest": { 
     "setupEnvScriptFile": "node_modules/react-native/jestSupport/env.js", 
     "testPathIgnorePatterns": ["/node_modules/"], 
     "testFileExtensions": [ 
      "es6", "js" 
     ], 
     "moduleFileExtensions": [ 
      "js", "json", "es6" 
     ], 
     "unmockedModulePathPatterns": [ 
      "react", 
      "react-addons-test-utils", 
      "react-native-router-flux", 
      "fetch", 
      "redux", 
      "redux-thunk" 
     ], 
     "collectCoverage": true, 
     "verbose": true, 
     "haste": { 
      "defaultPlatform": "android", 
      "platforms": [ 
       "ios", "android" 
      ], 
      "providesModuleNodeModules": ["react-native"] 
     } 
    } 
} 

И, наконец, мой примерный тестовый пример:

jest.autoMockOff(); 

import React, { View } from 'react-native'; 
import utils from 'react-addons-test-utils'; 
// import React, {View} from 'react-native'; 
// import utils from 'react-addons-test-utils'; 

jest.dontMock('../Connections'); 
// import Connections from '../Connections'; 
const Connections = require('../Connections'); 

describe('Connections', (props) => { 
    function renderConnections() { 
    const renderer = utils.createRenderer(); 
    renderer.render(<Connections {...props}/>); 
    const output = renderer.getRenderOutput(); 
    return { 
     props, 
     output, 
     renderer 
    }; 
    } 
    it('should return View',() => { 
    const output = renderConnections({someProps: true}); 
    expect(output).toEqual(View); 
    }) 
}) 

И у меня Передразнивало реагирующие-native.js, который выглядит следующим образом:

'use strict'; 
/** 
* ## Imports 
* 
* ReactNative is actually React 
*/ 
const React = require('react'); 
const ReactNative = React; 

/** 
* ## These need additional mocking 
* 
* ReactNative is actually React 
*/ 
ReactNative.StyleSheet = { 
    create: function create(styles) { 
     return styles; 
    } 
}; 
class View extends React.Component { 
    render() { return false; } 
} 
class PixelRatio extends React.Component { 
    static get() { return 1; } 
} 
/** 
* ## Stubs 
* 
* Simple replacements for testing 
*/ 
ReactNative.View = View; 
ReactNative.ScrollView = View; 
ReactNative.Text = View; 
ReactNative.TouchableOpacity = View; 
ReactNative.TouchableHighlight = View; 
ReactNative.TouchableWithoutFeedback = View; 
ReactNative.ToolbarAndroid = View; 
ReactNative.Image = View; 
ReactNative.PixelRatio = PixelRatio; 
ReactNative.NativeModules= {}; 

ReactNative.Platform = {}; 
module.exports = ReactNative; 
+0

Предлагаем прочитать: [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) – wogsland

ответ

0

Я предполагаю, что ваш импорт в тесте:

jest.autoMockOff(); 

import React, { View } from 'react-native'; 

не может быть на самом деле Импортирование custom react-native.js

Вы бы хотели вместо этого импортировать относительный ?

+2

Спасибо за ответ. Я, наконец, понял, что решение заключалось в том, что мне пришлось использовать 'jest.unmock ('../ Connections')' вместо 'jest.dontMock ('../ Connections');' в файле тестирования. В официальном документе Jest говорится о jest.unmock, как это: ** Примечание: этот метод ранее назывался dontMock. При использовании babel-jest вызовы для разблокировки автоматически будут подняты в верхней части блока кода. Используйте dontMock, если вы хотите явно избежать этого поведения. ** Поэтому, после того как я изменил его, чтобы разблокировать, все работает нормально. – sunnyyants

+0

sunnyyants, даже после перехода на разблокировку, я получаю ту же ошибку с вашим примером. Любая другая настройка/код, который нужно изменить? – bschandramohan

0

Component is not a function также может возникнуть, если вы забыли экспортировать компонент из модуля.