2017-06-20 7 views
0

私は反応コンポーネントのテストカバレッジを改善しようとしていますが、コンポーネントのレンダリングメソッドで宣言されている変数と関数のテストで問題があります。以下は私がカバー取得できませんよ例のカップルされています。ここでは、コード反応コンポーネントのレンダリング関数内で関数と変数をテストするにはどうすればよいですか?

1)

cityStateZip = `${cityStateZip} - ${location.zipExtension}`; 

2)

directionsUrl = `maps://maps.apple.com/?saddr=My+Location&daddr=${gpsCoords.lat}+${gpsCoords.lng}`; 

3)

const onClick = (pricingTileId) => { 
    if (store.selectedPharmacy !== pricingTileId) { 
    store.setPharmacy(pricingTileId); 
    } 
}; 

です。

class Tile extends Component { 
    const { location, store } = this.props; 
    render() { 
    let directionsUrl = `https://maps.google.com/?saddr=My+Location&daddr=${gpsCoords.lat}+${gpsCoords.lng}`; 
    if (navigator.platform.indexOf('iPhone') !== -1 
     || navigator.platform.indexOf('iPod') !== -1 
     || navigator.platform.indexOf('iPad') !== -1) { 
     directionsUrl = `maps://maps.apple.com/?saddr=My+Location&daddr=${gpsCoords.lat}+${gpsCoords.lng}`; 
    } 

    let cityStateZip = `${location.city}, ${location.state} ${location.zip}`; 
    if (location.zipExtension) { 
     cityStateZip = `${cityStateZip} - ${location.zipExtension}`; 
    } 

    const onClick = (pricingTileId) => { 
     if (store.selectedLocation !== pricingTileId) { 
     store.setLocation(pricingTileId); 
     } 
    }; 

    let selectedClass; 
    if (store.selectedLocation === id) { 
     selectedClass = 'selected'; 
    } 

    return (

    ) 

私が見落としているレンダリング関数で宣言されている変数と関数をテストする有効な方法はありますか? (私はテストのためにJestとEnzymeを使用しています)。ありがとうございました!

+0

、それはロジックが大_within_テストすることは難しいです多くのことをしている関数です。そのため、レンダリング関数が使用できるいくつかの小さなメソッドを記述することをお勧めします。 'getCityStateZip()'がzip拡張ロジックを処理し、 'getDirectionsUrl()'がデバイス固有のロジックを処理するようにします – Hamms

答えて

2

あなたはこのようなあなたのコンポーネントをリファクタリングすることができます:PART 2 ============== ...

class Tile extends Component { 

    isMobile =() => { 
    let mob = navigator.platform 

    if (mob.indexOf('Iphone')) return true 
    if (mob.indexOf('Ipad')) return true 
    if (mob.indexOf('Ipod')) return true 

    return false 
    } 

    isZipValid =() => !!this.props.location.zipExtension 
    isLocationValid = (id) => this.props.store.location === id 


    handleClick = (pricingTileId) => { 
    const { store } = this.props; 

    if (store.selectedLocation !== pricingTileId) { 
     store.setLocation(pricingTileId); 
    } 
    } 

    render() { 


    let directionsUrl 
    let selectedClass = isLocationValid() && 'selected'; 
    let cityStateZip = `${location.city}, ${location.state} ${location.zip}`; 

    if (!isMobile()) { 
     directionsUrl = `maps://maps.apple.com/?saddr=My+Location&daddr=${gpsCoords.lat}+${gpsCoords.lng}`; 
    } 

    if (isZipValid()) { 
     cityStateZip = `${cityStateZip} - ${location.zipExtension}`; 
    } 
    return (
     <div> Anything</div> 
    ) 
    } 

を========= =========

libまたはhelpers のような別のファイルにそれらを抽出して、コンポーネントにインポートすることができます。

ヘルパー::

//helpers.jsコンポーネントの最後に

export const isMobile = (mob) => { 

    if (mob.indexOf('Iphone')) return true 
    if (mob.indexOf('Ipad')) return true 
    if (mob.indexOf('Ipod')) return true 

    return false 
    } 

export { isMobile } from './helpers' 

    if(isMobile(navigator.platform)){ 

    //you just abstracted the function 

    } 

は結論:あなたのisMobile()を簡単にテストすることができ、このよう

ヘルパーからのメッセージと任意のコンポーネントへの供給:)今

あなたは簡単に機能によって機能をテストすることができます

私はそれはあなたが助けを願って:D親切

、原則として

+0

意味があります、ありがとう!これは愚かな質問かもしれませんが、私はこの性質をテストするのがとても新しいです。テストでこれらのメソッドにアクセスするにはどうすればよいですか?例えばisMobile関数。私はTileコンポーネントのインポートとコンソールのロギングを行っていますが、これらのメソッドをどこにでも配置することはできません。それらをテストする方法はあまりよく分かりません。助けをありがとう非常にありがとう:) – TigerBalm

+0

上記の私のポストの2つのチェック部分 –

関連する問題