過去幾個月,我一直在使用React中的ApolloJS(通過react-apollo
),並學習了許多與單元測試相關的技巧和挑戰Apollo-包裹的組件。在安裝React組件的單元測試中處理阿波羅包裹的後代
當測試一個直接用Apollo包裝的組件時,我在導出並測試該組件之前用由graphql
返回的HoC進行測試。在測試具有阿波羅包裝組件的組件作爲後代時,我儘可能使用Enzyme的shallow
渲染來防止安裝該後代。如果需要通過mount
進行全DOM渲染,我使用Apollo測試工具中的MockedProvider
,以便後代不會嘗試訪問this.context
時發生錯誤。
但是,我還沒有找到一個解決方案,但是,對於下列情況:一個包含Apollo包裹後裔的組件需要使用完全DOM呈現進行測試,但我還需要做出涉及組件實例的斷言(例如狀態,實例方法等)。爲了避免後代問題,我必須將組件包裝在模擬的提供者中,但這意味着wrapper
上的任何斷言都在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
的替代品,但還沒有發現任何東西。
有沒有人想出瞭解決這種情況的解決方法,還是有不同的方法,我應該採取處理嵌套阿波羅包裹的組件?