我正在使用jest
编写React Native Algolia Search组件的测试。
(非常剥离的)NoResults
组件:
import React from 'react'
import { Text, View } from 'react-native'
import { connectStateResults } from 'react-instantsearch-native'
const NoResults = ({ searching, searchState: { query } }) => searching || !query ? null : (
<View>
<Text>No Results</Text>
</View>
)
export default connectStateResults(NoResults)
在<projectRoot>/__mocks__/react-instantsearch-native.js
module.exports = jest.genMockFromModule('react-instantsearch-native')
我的考试
import 'react-native'
import React from 'react'
import renderer from 'react-test-renderer'
import * as risn from 'react-instantsearch-native'
import NoResults from './NoResults'
jest.mock('react-instantsearch-native')
it('renders correctly', () => {
risn.connectStateResults.mockImplementation(comp => comp({ searching: true, searchState: { query: '' } }))
const tree = renderer.create(<NoResults />).toJSON()
expect(tree).toMatchSnapshot()
})
我发现connectStateResults
从不返回任何内容。
Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
19 | })
20 |
> 21 | const tree = renderer.create(<NoResults />).toJSON()
我已经检查过了,肯定已经加载并使用了该模拟,但是在设置mockImplementation
函数之前就已经使用了该模拟。
如何正确模拟Algolia的连接器?
更新
阿尔及利亚支持小组建议我更改线路
risn.connectStateResults.mockImplementation(comp => comp({ searching: true, searchState: { query: '' } }))
到
risn.connectStateResults.mockImplementation(comp => () => comp({ searching: true, searchState: { query: '' } }))
但这没什么作用
答案 0 :(得分:0)
我的解决方法如下:
问题在于,NoResult
在connectStateResults
组件中(正确地)在加载模拟之后但在调用mockImplementation
之前正在执行,因为它是在{{1 }}首先导入。
解决方案实际上很简单。
我在模拟NoResult
中设置了mockImplementation
,而不是在测试中进行复杂的mockImplementation
调用,只是将实现设置为简单的标识函数<projectRoot>/__mocks__/react-instantsearch-native.js
< / p>
const a => a
然后我的考试变成
const i = a => a
const risn = jest.genMockFromModule('react-instantsearch-native')
risn.connectStateResults.mockImplementation(i)
module.exports = risn
这很完美,可以轻松扩展到使用Algolia连接器的任何其他组件。