2016-12-16 46 views
0

我试图测试一个我创建的组件,它使用react-native-maps中的MapView作为子组件。我知道我需要模拟的是原生成分,但我已经写还是标志了一个错误:无法模拟本机模块

import 'react-native'; 
import React from 'react'; 
import Detail from '../js/components/Detail'; 

// Note: test renderer must be required after react-native. 
import renderer from 'react-test-renderer'; 

jest.mock('react-native-maps',() => 'MapView'); 

it('renders correctly',() => { 
    const tree = renderer.create(
    <Detail /> 
).toJSON(); 
    expect(tree).toMatchSnapshot(); 
}); 

和错误我收到:

TypeError: Cannot read property 'setNativeProps' of null

任何帮助,将不胜感激。

编辑:如果有帮助,这里有我想要测试组件...

import React, { Component } from 'react'; 
import { 
    Dimensions, 
    LayoutAnimation, 
    StyleSheet, 
    Text, 
    TouchableHighlight, 
    View, 
} from 'react-native'; 
import MapView from 'react-native-maps'; 

import MapExpandButton from './buttons/MapExpandButton'; 

const styles = StyleSheet.create({ 
    ... 
}); 

export default class AppointmentDetail extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     expanded: false, 
    } 
    } 

    componentWillUpdate() { 
    LayoutAnimation.easeInEaseOut(); 
    } 

    renderMap() { 
    return (
     <MapView 
     initialRegion={{ 
      latitude: 51.501211, 
      longitude: -0.110530, 
      latitudeDelta: 0.005, 
      longitudeDelta: 0.005, 
     }} 
     scrollEnabled={this.state.expanded} 
     pitchEnabled={this.state.expanded} 
     zoomEnabled={this.state.expanded} 
     rotateEnabled={this.state.expanded} 
     loadingEnabled={true} 
     showsPointsOfInterest={false} 
     style={[styles.map, this.state.expanded ? styles.mapExpanded : undefined]}> 
     <MapView.Marker 
      coordinate={{ 
      latitude: 51.501211, 
      longitude: -0.110530, 
      }} 
      title='My Pin' 
      description='Somewhere' 
     /> 
     </MapView> 
    ); 
    } 

    renderSummary() { 
    return (
     <View style={styles.section}> 
     <Text style={styles.headline}> 
      Appointment Type 
     </Text> 
     <Text style={styles.subheading}> 
      on Date at Timeslot 
     </Text> 
     </View> 
    ); 
    } 

    renderAddress() { 
    if (!this.state.expanded) { 
     return (
     <View style={styles.section}> 
      <Text style={styles.body}> 
      Address Line 1, 
      </Text> 
      <Text style={styles.body}> 
      Address Line 2, 
      </Text> 
      <Text style={styles.body}> 
      City POSTCODE, 
      </Text> 
     </View> 
    ); 
    } 
    } 

    renderSections() { 
    return (
     <View> 
     { this.renderSummary() } 
     { this.renderAddress() } 
     </View> 
    ); 
    } 

    toggleExpand() { 
    const newExpandedState = !this.state.expanded; 
    this.setState({ expanded: newExpandedState }); 
    if (this.props.didChangeExpandedState) { 
     this.props.didChangeExpandedState(newExpandedState); 
    } 
    } 

    render() { 
    return (
     <View style={styles.container}> 
     { this.renderMap() } 
     { this.renderSections() } 
     <View style={{ position: 'absolute', right: 8, top: 8 }}> 
      <MapExpandButton onPress={this.toggleExpand.bind(this)} /> 
     </View> 
     </View> 
    ); 
    } 
} 

回答

2

发现GitHub上从这个问题的解决方案:https://github.com/facebook/jest/issues/1960

我认为这个问题是MapView.Marker子组件没有被嘲笑。这个答案也是模拟儿童组件。

jest.mock('react-native-maps',() => { 
    return class MockMapView extends React.Component { 
    static Marker = props => React.createElement('Marker', props, props.children); 
    static propTypes = { children: React.PropTypes.any }; 

    render() { 
     return React.createElement('MapView', this.props, this.props.children); 
    } 
    } 
}); 
1

当我遇到了这个问题,我加入了模块忽略列表下笑话你的package.json :

"transformIgnorePatterns": [ 
    "node_modules/(?!react-native|react-native-maps)" 
] 
+0

非常感谢,我会试试看。我是否使用了正确的名字?不知道它是否应该是软件包名称或组件名称 – SimonTheEngineer

+0

是的,相当肯定你做得对。尽管你可能需要向transformignorepatters添加更多内容,但我仍然继续运行它,并且每次关于本机包的错误都会扔到那里。 –

+0

好的,谢谢你的帮助! – SimonTheEngineer