質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

Q&A

1回答

1823閲覧

ReactNative:snapshotのテストにおけるMockの方法が分かりません

mariek

総合スコア6

React Native

React Nativeは、ネイティブモバイルアプリ(iOS/Android)を作成できるJavaScriptフレームワークです。Reactと同じ設計のため、宣言的なコンポーネントでリッチなUIを開発することが可能です。

0グッド

0クリップ

投稿2017/08/03 04:09

編集2017/08/03 04:38

###前提・実現したいこと
現在、ReactNativeで、iPad、Windows Tabletをターゲットとしたタブレットアプリを開発しています。
APIから取得したプロジェクト一覧を表示するような画面を実装して、
jestのsnapshotを使って画面のテストを実装してみたのですが、
APIの呼び出し部分のMockの方法が分からず困っています。

ご回答よろしくお願いいたします。

###該当のソースコード
Home.js

lang

1import React, { Component } from 'react'; 2import { 3 AppRegistry, 4 StyleSheet, 5 Text, 6 FlatList, 7 View, 8 TouchableHighlight, 9} from 'react-native'; 10import { connect } from 'react-redux'; 11import { bindActionCreators } from 'redux'; 12import * as actions from '../Actions'; 13import 'fetch-everywhere'; 14 15class Home extends Component { 16 constructor(props) { 17 super(props); 18 this.state = { 19 projects: [], 20 }; 21 } 22 23 componentWillMount = (props) => { 24 const { dispatch } = this.props; 25 // ここでプロジェクト一覧のデータを取得するAPIの呼び出し 26 this.props.actions.getAllProjects(); 27 } 28 29 render() { 30 const props = this.props; 31 const { navigate } = this.props.navigation; 32 33 return ( 34 <View> 35 <FlatList style={styles.list} 36 // APIから取得したデータを取り出す(※ここをMockしたい※) 37 // 今の状態でテストするとdataの中身が空になります 38 data={props.projects.getAllProjects.projects} 39 renderItem={({item}) => 40 <TouchableHighlight onPress={() => navigate('Project', { project: item })} underlayColor='paleturquoise'> 41 <View style={styles.project}> 42 <Text style={styles.projectName}>{item.title}</Text> 43 </View> 44 </TouchableHighlight> 45 } 46 /> 47 </View> 48 ); 49 } 50}; 51 52const styles = StyleSheet.create({ 53 project: { 54 margin: 10, 55 }, 56 list: { 57 marginTop: 20, 58 }, 59 projectName: { 60 fontSize: 20, 61 textAlign: 'left', 62 flex: 1, 63 }, 64}); 65 66const mapStateToProps = (state) => { 67 return { 68 projects: state, 69 } 70} 71 72const mapDispatchToProps = (dispatch) => { 73 return { 74 actions: bindActionCreators(actions, dispatch) 75 } 76} 77 78export default connect(mapStateToProps, mapDispatchToProps)(Home)

index.ios.js(テストコード)

lang

1import 'react-native'; 2import React from 'react'; 3import Index from '../index.ios.js'; 4 5// Note: test renderer must be required after react-native. 6import renderer from 'react-test-renderer'; 7 8it('renders correctly', () => { 9 const tree = renderer.create( 10 <Index /> 11 ).toJSON(); 12 expect(tree).toMatchSnapshot(); 13}); 14

index.ios.js.snap(自動生成されたスナップショット)

// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`renders correctly 1`] = ` <View style={ Object { "alignItems": "center", "backgroundColor": "#F5FCFF", "flex": 1, "justifyContent": "center", } } > <View> <Text accessible={true} allowFontScaling={true} disabled={false} ellipsizeMode="tail" style={ Object { "fontSize": 30, "fontWeight": "bold", "marginTop": 20, "textAlign": "center", } } > プロジェクト一覧 </Text> <RCTScrollView ListHeaderComponent={undefined} // 今の状態だとdataの中身が空 data={Array []} disableVirtualization={false} getItem={[Function]} getItemCount={[Function]} horizontal={false} initialNumToRender={10} keyExtractor={[Function]} maxToRenderPerBatch={10} numColumns={1} onContentSizeChange={[Function]} onEndReachedThreshold={2} onLayout={[Function]} onMomentumScrollEnd={[Function]} onScroll={[Function]} onScrollBeginDrag={[Function]} onScrollEndDrag={[Function]} onViewableItemsChanged={undefined} renderItem={[Function]} renderScrollComponent={[Function]} scrollEventThrottle={50} stickyHeaderIndices={Array []} style={ Object { "marginTop": 20, } } updateCellsBatchingPeriod={50} windowSize={21} > <View /> </RCTScrollView> </View> </View> `;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

React の思想や Jest のスナップショットテスティングのやりかたとして次があります

  • テスト対象: あるコンポーネントに対して
  • 入力: 特定の props を与えたときに
  • 出力: 想定した仮想 DOM ツリーになる

ですので、コンポーネントとしてテスト可能にするために data を props として与えてやる設計として、 data prop のパターンをいくつか作ってテストしてやる、というのが妥当かなと思います

API のテストは別で async/await を使ったテストケースを作ってやればよいでしょう

答えになっていますでしょうか ?

投稿2017/08/03 05:29

januswel

総合スコア301

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mariek

2017/08/03 06:35

ご回答ありがとうございます! > コンポーネントとしてテスト可能にするために `data` を props として与えてやる設計として、 `data` prop のパターンをいくつか作ってテストしてやる、 設計を変更するかどうかは改めて検討したいと思います。 現在の設計を変更せずに、テストコードを工夫してMockする方法はないということでしょうか・・?
januswel

2017/08/03 07:41

`projects.getAllProjects.projects` にダミーデータを入れて `Home` コンポーネントに props として `projects` を渡すことでいけそうですが
mariek

2017/08/04 01:53

ご回答ありがとうございます。 教えていただいた情報でちょっと試してみたいと思います。 試した結果、またご報告させていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問