我正在尝试在 Jest 中为我正在处理的 React Native 项目编写测试。我正在使用 redux 和 react-router-native,如果不将它们包装在 Provider 和 MemoryRouter 中,我就无法为测试渲染组件。我正在尝试测试的组件连接到我的 Redux 存储并使用该withRouter
功能来访问路由器道具(历史、匹配等)。
我最终得到了这个:
const tree = renderer.create(<Provider store={store}><MemoryRouter><Results /></MemoryRouter></Provider>).toJSON();
这对于快照测试很有效,但是当我尝试测试我的类组件中的函数时遇到了麻烦<Results />
。我尝试使用.getInstance()
,但这返回 null 因为 Provider 是父级并且它是一个功能组件。
我终于能够在渲染时<Results />
使用组件,但结果很难看。.root
在我开始之前,我必须挖掘几个级别的孩子。我想知道是否有更好的方法来测试必须包装在 Provider 和 MemoryRouter 组件中才能呈现的类组件上的函数。
import 'react-native'
import React from 'react'
import { MemoryRouter } from 'react-router-native'
import { Provider } from 'react-redux'
import Results from '../components/results/Results'
import renderer from 'react-test-renderer'
import configureStore from 'redux-mock-store'
import { mockResults } from '../__mocks__/results'
const mockStore = configureStore()
describe('Results page numbers tests', () => {
let store, tree, results
beforeEach(() => {
store = mockStore({
results: mockResults,
loader: false,
resultsLoader: false,
searchPage: 1,
query: '',
pages: []
})
tree = renderer.create(
<Provider store={store}>
<MemoryRouter>
<Results />
</MemoryRouter>
</Provider>
).root;
results = tree.children[0].children[0].children[0].children[0]._fiber.stateNode
})
it('calculates correct number of pages', () => {
expect(results.numPages()).toEqual(298728)
})
})