2017-06-28 28 views
0

私はアプリケーションを[email protected]に移行しています。enzymemount機能を使用しているテストを取得することに問題があります。反応ルータv4でマウントされたコンポーネントをテストする

withRouter-wrapされたサブコンポーネントを持つコンポーネントをマウントするたびに問題が発生します。

class SomePage extends React.Component { 
    componentDidMount() { 
    this.props.getData(); 
    } 
    render() { 
    return (
     <div> 
     <ComponentWrappedInWithRouter /> 
     </div> 
    ); 
    } 
} 

const Component = (props) => (
    <button onClick={() => this.props.history.push('/new-route') }> 
    Click to navigate 
    </button> 
); 

const ComponentWrappedInWithRouter = withRouter(Component); 

は今、私はそれが取り付けられていた後にその小道具getDataを呼び出すSomePageそれをテストしたい:

は、ここで私がテストだよ何の簡素化状況の例です。愚かな例、私は知っているが、構造は十分でなければならない。

私はenzymeさんmountを使用してテストを書くたびに、私は次のエラーを取得する:

TypeError: Cannot read property 'route' of undefined 
    at Route.computeMatch (node_modules/react-router/Route.js:68:22) 
    at new Route (node_modules/react-router/Route.js:47:20) 

今、私は私にはないコンポーネントのwithRouterを呼び出そうとするのでこれが起こる理由はあると思います文脈上にrouterがあります。つまり、<BrowserRouter />またはその兄弟の1つにラップされていません。

これは[email protected]の問題ではありませんでしたが、現在のメジャーは完全な書き換えであったため、これらの問題が発生することを完全に理解しています。

どのように私はこれを修正することができますか?

答えて

1

かなり簡単です:MemoryRouterでテスト中のコンポーネントをラップして、react-router-domからあなたはいいですね。

https://github.com/ReactTraining/react-router/blob/master/packages/react-router/docs/api/MemoryRouter.md

+0

そのアプローチの問題は、もはやあなたがテストしているコンポーネントの状態へのアクセスを持っていないということです。だから、それは作品のようなものですが、実際はそうではありません。また、それは間違って感じる! ^^ –

+0

なぜですか? 'find'を使ってマウントするコンポーネントに潜入することができます。なぜなら'浅い 'ではなく' mount'を使っているからです。私はもちろん何かを見逃しているかもしれませんが、元の質問で何を意味するのかははっきりしません:) – CharlieBrown

+0

私が 'mount(...)を使うとfind( 'SomePage')。state()'、私にエラーが表示されますルートコンポーネントの状態、つまりマウントされているコンポーネントにのみアクセスできます。そして、 'MemoryRouter'で物をラップすると、それがルートコンポーネントになります。 'Dive'と' find'の両方で 'SomePage'に入ることを試みて、それを再マウントしようとしました - それは動作させることができませんでした。 –

関連する問題