Как использовать Jest, чтобы издеваться над разъемами Algolia? - PullRequest
0 голосов
/ 03 июня 2019

Я использую jest для написания тестов моих React Native Algolia Search компонентов.

A (очень урезанный) 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?

Обновление

Поддержка Algolia предложила изменить строку

risn.connectStateResults.mockImplementation(comp => comp({ searching: true, searchState: { query: '' } }))

на

risn.connectStateResults.mockImplementation(comp => () => comp({ searching: true, searchState: { query: '' } }))

, но это не имеет значения

1 Ответ

0 голосов
/ 04 июня 2019

Я решил это следующим образом:

Проблема заключается в том, что в NoResult компоненте connectStateResults выполняется после загрузки макета (правильно), но до вызова mockImplementation,потому что он вызывается при первом импортировании NoResult.

Решение на самом деле тривиально.

Вместо сложного вызова mockImplementation в тесте я настроил mockImplementation в моём макете<projectRoot>/__mocks__/react-instantsearch-native.js и просто установите реализацию в качестве простой функции идентификации const a => a

const i = a => a

const risn = jest.genMockFromModule('react-instantsearch-native')

risn.connectStateResults.mockImplementation(i)

module.exports = risn

Тогда мой тест станет

import 'react-native'
import React from 'react'
import renderer from 'react-test-renderer'

import NoResults from './NoResults'

jest.mock('react-instantsearch-native')

it('renders correctly when searching', () => {
  const tree = renderer
    .create(<NoResults searching searchState={{ query: '' }} />)
    .toJSON()
  expect(tree).toMatchSnapshot()
})

Это отлично работает и может быть легко расширено, чтобы охватить любуюдругие компоненты, использующие разъемы Algolia.

...