Тестирование redux-saga с множественным выбором

У меня есть сага с функциями выбора, которые должны брать пару информации из состояния и использовать их для перехода к новому URL-адресу.

КОД ДЛЯ SAGA:

export function* appRedirectToNewTopic() {
  const getCreatingNewTopicError = yield select(getCreatingTopicError);
  const newTopicId = yield select(getNewTopicId);
  const groupId = yield select(getGroupId);
  if (isEmpty(getCreatingNewTopicError)) { // this is lodash isEmpty
    yield put(push(getRouteUrl(routerUrls.TOPIC_CHAT.url, {
      groupId,
      topicId: newTopicId,
    })));
  } // TODO add here when notification is made
}

КОД ДЛЯ ТЕСТА SAGA:

describe('appRedirectToNewTopic', () => {
  const action = appCreateNewTopicFinishedAction();
  const generator =
    cloneableGenerator(appRedirectToNewTopic)(action);
  const expectedGroupId = {
    apiGroups: {
      groupInfo: {
        groupInfo: {
          id: 466,
        },
      },
    },
  };
  const expectedTopicId = {
    apiTopics: {
      newTopicId: 22466,
    },
  };
  let topicId;
  let groupId;

  it('should return empty error', () => {
    expect(generator.next().value)
      .toEqual(select(getCreatingTopicError));
  });

  it('should return new topicId', () => {
    topicId = generator.next(expectedTopicId).value;
    expect(topicId)
      .toEqual(select(getNewTopicId));
  });

  it('should return groupId', () => {
    groupId = generator.next(expectedGroupId).value;
    expect(groupId)
      .toEqual(select(getGroupId));
  });

  it('should redirect user to new topic screen', () => {
    expect(generator.next().value)
      .toEqual(put(push(getRouteUrl(routerUrls.TOPIC_CHAT.url, {
        groupId,
        topicId,
      }))));
  });
});

Ошибка, которую я получаю, должна перенаправить пользователя в новую тему, а ошибка - Expected value to equal: {"@@redux-saga/IO": true, "PUT": {"action": {"payload": {"args": ["/chat/[object Object]/[object Object]"], "method": "push"}, "type": "@@router/CALL_HISTORY_METHOD"}, "channel": null}} Received: undefined .

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
716
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Значение, которое вы передаете следующему методу, - это то, что должен дать текущий yield, а не тот, который вы тестируете с равным после этого. Попробуй это:

describe('appRedirectToNewTopic', () => {
  const action = appCreateNewTopicFinishedAction();
  const generator =
    cloneableGenerator(appRedirectToNewTopic)(action);
  const expectedGroupId = {
    apiGroups: {
      groupInfo: {
        groupInfo: {
          id: 466,
        },
      },
    },
  };
  const expectedTopicId = {
    apiTopics: {
      newTopicId: 22466,
    },
  };
  let topicId;
  let groupId;

  it('should return empty error', () => {
    expect(generator.next().value)
      .toEqual(select(getCreatingTopicError));
  });

  it('should return new topicId', () => {
    topicId = generator.next().value;
    expect(topicId)
      .toEqual(select(getNewTopicId));
  });

  it('should return groupId', () => {
    groupId = generator.next(expectedTopicId).value;
    expect(groupId)
      .toEqual(select(getGroupId));
  });

  it('should redirect user to new topic screen', () => {
    expect(generator.next(expectedGroupId).value)
      .toEqual(put(push(getRouteUrl(routerUrls.TOPIC_CHAT.url, {
        groupId,
        topicId,
      }))));
  });
});

Спасибо Мартин. Это сработало. Если честно, я не понял, почему это сработало. Не могли бы вы подробнее объяснить свой ответ или указать мне какой-нибудь материал для чтения. извините, я могу дать вам только 25 пинт. Я бы дал вам больше, если бы мог :)

Lazar Nikolic 29.10.2018 08:21

Это не что-то конкретное для саг, а генераторы в целом. Я предлагаю просто немного поиграть с генераторами - вы также можете прочитать о них на популярных сайтах, таких как MDN. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…

Martin Kadlec 29.10.2018 18:35

Тем не менее, я постараюсь объяснить проблему дальше. Важно помнить, какая часть генератора в какой момент выполняется. Когда вы создаете генератор, ни один из кодов внутри не выполняется, при первом вызове next генератор начинает выполняться с начала до первого yield. Значение, которое вы получаете от первого вызова next(), - это то, что принесла первая доходность. Теперь, когда вы вызываете next во второй раз, вы можете передать ему значение, и оно будет использоваться вместо первого выражения yield, затем функция продолжит выполнение с этим новым значением до второго yield и т. д.

Martin Kadlec 29.10.2018 18:40

Спасибо Мартин :)

Lazar Nikolic 29.10.2018 18:49

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