Дразнящий метод client.query ApolloClient с помощью Jest - PullRequest
0 голосов
/ 20 января 2020

Обновление от 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(),
}))

... но я этого не вижу.

1 Ответ

1 голос
/ 21 января 2020

Вы не правильно издевались. Вот правильный путь:

getAssetIdFromService.ts:

import { setupApi } from './setup';
import { gql } from 'apollo-server';

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 },
  });
};

setup.ts:

export const setupApi = (): any => {};

getAssetIdFromService.test.ts:

import { getAssetIdFromService, GET_ASSET_ID } from './getAssetIdFromService';
import { setupApi } from './setup';

jest.mock('./setup.ts', () => {
  const mApolloClient = { query: jest.fn() };
  return { setupApi: jest.fn(() => mApolloClient) };
});

describe('59829676', () => {
  it('should query and return data', async () => {
    const client = setupApi();
    const mGraphQLResponse = { data: {}, loading: false, errors: [] };
    client.query.mockResolvedValueOnce(mGraphQLResponse);
    const { data, loading, errors } = await getAssetIdFromService('e1');
    expect(client.query).toBeCalledWith({ query: GET_ASSET_ID, variables: { externalId: 'e1' } });
    expect(data).toEqual({});
    expect(loading).toBeFalsy();
    expect(errors).toEqual([]);
  });
});

Результаты модульного тестирования со 100% покрытием:

 PASS   apollo-graphql-tutorial  src/stackoverflow/59829676/getAssetIdFromService.test.ts (8.161s)
  59829676
    ✓ should query and return data (7ms)

--------------------------|----------|----------|----------|----------|-------------------|
File                      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
--------------------------|----------|----------|----------|----------|-------------------|
All files                 |      100 |      100 |      100 |      100 |                   |
 getAssetIdFromService.ts |      100 |      100 |      100 |      100 |                   |
--------------------------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        8.479s

Исходный код: https://github.com/mrdulin/apollo-graphql-tutorial/tree/master/src/stackoverflow/59829676

...