如何使用Jest模拟Algolia的连接器?

时间:2019-06-03 09:16:52

标签: mocking jestjs algolia

我正在使用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: '' } }))

但这没什么作用

1 个答案:

答案 0 :(得分:0)

我的解决方法如下:

问题在于,NoResultconnectStateResults组件中(正确地)在加载模拟之后但在调用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连接器的任何其他组件。