Как мне получить данные ответа из макетного файла axios в тест?

#javascript #jestjs #axios

#javascript #jestjs #axios

Вопрос:

У меня возникли проблемы с размещением моих данных ответа для макета axios. Если я включу данные в макет файла, тест пройдет. Если я включу его в тест axiosMock.get.mockResolvedValue(); , он этого не сделает. Мне не нужен ответ в макетном файле, потому что этот файл должен работать со всеми тестами axios.

Если я включу свой ответ в макетный файл axios следующим образом, все будет работать так, как ожидалось.

 // __mocks__/axios.js
export default {
  create: jest.fn(() => ({
    get: jest.fn().mockResolvedValue({
      data: {
        data: [
          {
            label: 'Started',
            value: 'started',
            type: 'Milestone',
          },
          {
            label: 'Detected',
            value: 'detected',
            type: 'Milestone',
          },
          {
            label: 'Acknowledged',
            value: 'acknowledged',
            type: 'Milestone',
          },
        ],
      },
    }),
    interceptors: {
      request: { use: jest.fn(), eject: jest.fn() },
      response: { use: jest.fn(), eject: jest.fn() },
    },
  })),
  get: jest.fn(),
};
  

Мой тестовый файл:

 // Condition.spec.js
test('fetches and displays data', async () => {
  axiosMock.get.mockResolvedValue();

  const { container } = render(
    <Condition {...props} />
  );
  await wait(() => expect(container.textContent).toContain('Current milestone is Acknowledged'));
  expect(container).toBeDefined();
});
  

Если я удалю его из макетного файла и помещу в тест, он завершится с ошибкой:

 // __mocks__/axios.js
export default {
  create: jest.fn(() => ({
    get: jest.fn().mockResolvedValue(),
    interceptors: {
      request: { use: jest.fn(), eject: jest.fn() },
      response: { use: jest.fn(), eject: jest.fn() },
    },
  })),
  get: jest.fn(),
};
  
 // Condition.spec.js
test('fetches and displays data', async () => {
  axiosMock.get.mockResolvedValue({
    data: {
      data: [
        {
          label: 'Started',
          value: 'started',
          type: 'Milestone',
        },
        {
          label: 'Detected',
          value: 'detected',
          type: 'Milestone',
        },
        {
          label: 'Acknowledged',
          value: 'acknowledged',
          type: 'Milestone',
        },
      ],
    },
  });

  const { container } = render(
    <Condition {...props} />
  );
  await wait(() => expect(container.textContent).toContain('Current milestone is Acknowledged'));
  expect(container).toBeDefined();
});
  

Как мне получить данные ответа из макетного файла в сам тест?

Комментарии:

1. Как это axiosMock определяется?

2. Просто импорт axios: import axiosMock from 'axios';

3. Значит, вы тоже где-то издеваетесь над axios модулем, например jest.mock('axios') ?

4. Приведенный __mocks__/axios.js выше файл является макетом axios.

5. Вам нужен __mocks__/axios.js файл даже после перемещения макетных данных? В противном случае удалите его и используйте jest.mock('axios') вместо него для макета axios .

Ответ №1:

Попробуйте это —

 import firehydrantAPI from '../../helpers/firehydrantAPI'

jest.mock('../../helpers/firehydrantAPI');

const data = {
  "data":[
    {
      "label":"Started",
      "value":"started",
      "type":"Milestone"
    },
    {
      "label":"Detected",
      "value":"detected",
      "type":"Milestone"
    },
    {
      "label":"Acknowledged",
      "value":"acknowledged",
      "type":"Milestone"
    }
  ]
}

firehydrantAPI.get.mockImplementation(() => Promise.resolve({ data }));
  

Комментарии:

1. Нет кубиков. Извините.

2. данные не определены

3. Вы объявили постоянные данные, как я объявил выше? Я обновил свой ответ, пожалуйста, проверьте еще раз.

4. Я сделал. Это правильные данные, но компонент никогда не получает их в ответе.