Обновление от 22 января 2020 года
Решение от @ slideshowp2 верное, но я не смог заставить его работать вообще, из-за этой ошибки типа:
Ошибка типа: невозможно прочитать свойство 'query' не определено
Что ж, оказалось, что это была моя шутливая конфигурация, для которой было установлено resetMocks: true
. После того, как я удалил его, тест прошел. (Хотя я не знаю почему)
Оригинальный вопрос:
Мне нужно выполнить запрос graphql во вспомогательной функции вне компонента React, используя клиент Apollo и через некоторое время методом проб и ошибок я использовал этот подход, который работает так, как и предполагалось:
setup.ts
export const setupApi = (): ApolloClient<any> => {
setupServiceApi(API_CONFIG)
return createServiceApolloClient({ uri: `${API_HOST}${API_PATH}` })
}
getAssetIdFromService.ts
import { setupApi } from '../api/setup'
const client = setupApi()
export const GET_ASSET_ID = gql`
query getAssetByExternalId($externalId: String!) {
assetId: getAssetId(externalId: $externalId) {
id
}
}
`
export const getAssetIdFromService = async (externalId: string) => {
return await client.query({
query: GET_ASSET_ID,
variables: { externalId },
})
return { data, errors, loading }
}
Теперь я я пытаюсь написать тестовые тесты для функции getAssetIdFromService
, но у меня возникают проблемы с выяснением того, как заставить метод client.query
работать в тестах.
Я пробовал подход, описанный ниже, включая многие другие, которые Работа. Для этой конкретной установки jest бросает
TypeError: client.query не является функцией
import { setupApi } from '../../api/setup'
import { getAssetIdFromService } from '../getAssetIdFromService'
jest.mock('../../api/setup', () => ({
setupApi: () => jest.fn(),
}))
describe('getAssetIdFromService', () => {
it('returns an assetId when passed an externalId and the asset exists in the service', async () => {
const { data, errors, loading } = await getAssetIdFromService('e1')
// Do assertions
})
}
Я предполагаю, что что-то упустил в отношении этой части:
jest.mock('../../api/setup', () => ({
setupApi: () => jest.fn(),
}))
... но я этого не вижу.