Модуль Jest mock разрешает значение переменной

Предполагая, что у меня есть модуль, который возвращает обещание. Я хочу поиздеваться над разными результатами этого обещания, чтобы протестировать функцию, частью которой является этот модуль. Я издеваюсь над модулем следующим образом:

jest.mock('../request', () => {
    return () => new Promise((resolve, reject) => {
        return resolve({
            response: { ok: true }
        });
    });
});

Мой первый тест запущен

test("The function resolves", () => {
  const initialState = { apiData: getState("postData", {}, "ready", "POST") };
  const store: any = mockStore(initialState);
  return expect(
    performApiRequest("postData/", {}, { data: "json" })(dispatch, () =>
      store.getState()
    )
  ).resolves.toBeUndefined();
});

Теперь проблема заключается в тестировании другой функции, где разрешаемое значение должно быть другим, например {response: {ok: false}}.

Я уже пробовал разные вещи. Сначала оберните макет в функцию и дайте ответ в качестве аргумента. --> не удается, потому что макеты не могут выводить переменные из области видимости.

Я пытался вызвать jest.doMock в тесте, но это не запускает запрос правильно.

я пытался сделать

const mockResponse = jest.fn();
jest.mock("../request", () => {
  return () =>
    new Promise((resolve, reject) => {
      return resolve({
        mockResponse
      });
    });
});

А затем вызовите mockResponse.mockReturnValueOnce(value).

Успеха пока нет. Кто-нибудь видит выход?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
2 242
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете создать фиктивную функцию по умолчанию на верхнем уровне с помощью jest.fn. После создания макета вы можете переопределить реализацию функции в тестовом примере с помощью mockImplementation или mockImplementationOnce. Вы можете найти больше информации об этом в Jest документация.

import request from '../request';

jest.mock("../request", () =>
  jest.fn(() =>
    Promise.resolve({
      response: {
        ok: true
      }
    })
  )
);

test("MyTest", () => {
  request.mockImplementationOnce(() =>
    Promise.resolve({
      response: {
        ok: false
      }
    })
  );
});

Проблема с этой реализацией в том, что моему машинописному тексту это не нравится. mockImplementationOnce не существует по запросу. Поэтому мне нужно найти обходной путь для этого.

MokumJ 27.01.2019 23:07
Ответ принят как подходящий

ответ с машинописным текстом будет:

import request from '../request';

jest.mock("../request", () =>
  jest.fn(() =>
    Promise.resolve({
      response: {
        ok: true
      }
    })
  )
);

test("MyTest", () => {
    (request as jest.Mock).mockImplementationOnce(() =>
        Promise.resolve({
            response: {
                ok: true
            }
        })
    );
});

Другие вопросы по теме