私は過去数ヶ月間、ReactのApolloJSを使って作業していました(そして、ユニットテストに関連する多くのトリックと課題を学びました)ラップされたコンポーネント。ReactコンポーネントをマウントするユニットテストでApolloでラップされた子孫を処理する
Apolloで直接ラップされたコンポーネントをテストするとき、コンポーネントがエクスポートされ、HoCでラップされる前に、graphql
が返されます。子孫としてApolloでラップされたコンポーネントを持つコンポーネントをテストするとき、可能な限りEnzymeのshallow
レンダリングを使用して、その子孫がマウントされないようにします。 mount
で完全DOMレンダリングが必要な場合は、をApolloのテストユーティリティから使用して、子孫がthis.context
にアクセスしようとしてエラーをスローしないようにします。
しかし、Apolloでラップされた子孫を持つコンポーネントは、完全なDOMレンダリングを使用してテストする必要がありますが、コンポーネントインスタンスを含むアサーションも作成する必要があります(例:状態、インスタンスメソッドなど)。子孫との問題を避けるためには、虚偽のプロバイダでコンポーネントをラップする必要がありますが、のアサーションはMockedProvider
インスタンスで動作していて、テストしたいコンポーネントではありません。
例:
import { mount } from 'enzyme'
import { MockedProvider } from 'react-apollo/lib/test-utils'
// This component has descendants that are wrapped in Apollo and
// thus need access to `this.context` provided by an Apollo provider
import Assignments from 'app/components/assignments
...
describe('<Assignments />', function() {
it('sets sorted assignments in initial state', function() {
const assignments = [...]
const wrapper = mount(
<MockedProvider>
<Assignments assignments={assignments} />
</MockedProvider>
)
// This will fail because the wrapper is of the MockedProvider
// instance, not the Assignments instance
expect(wrapper.state('assignments')).to.eql([...])
})
})
私はむしろ私の知る限りサポートされていないルート、より子供のコンポーネントインスタンスにアクセスするための酵素を介した方法を見つけることを試みてきました。私はまた、これらのテストでMockedProvider
が必要であるという選択肢を見つけることを試みてきましたが、まだ何も見つかりませんでした。
このような状況の回避策を見つけた人がいますか、または入れ子にされたApolloラップコンポーネントを処理する別のアプローチがありますか?