Ложная локальная переменная, полученная в результате сагового теста - PullRequest
0 голосов
/ 11 февраля 2019

Я написал сагу, в которой используется yield select, чтобы получить часть состояния избыточного хранилища и сохранить его в локальной переменной.Переменная - это объект с тремя разными ключами, а значение каждого ключа - это массив объектов внутри него.

Мои тесты redux-saga продолжают терпеть неудачу, потому что я создаю эту локальную переменную в саге, которая использует данные из начального yield select, а в тестах эта переменная всегда равна undefined, что вызывает остальные мои тестыв этой саге потерпеть неудачу.Я видел много примеров того, как смоделировать возвращаемое состояние yield select в саге с редуксом, но это всегда в контексте следующего вызова сундука.Как смоделировать возвращаемое состояние для локальной переменной?

Вот мой код:

export default function* orderSelectionFlow({ payload }) {
  try {
    const orders = yield select(getOrders); // retrieve relevant part of redux store
    const activeOrder = orders[payload.orderStatus].find(order => order.id === payload.orderId); // this variable is always undefined in my tests, because I am not sure how to mock `orders` for a local variable.
    const activeOrderId = payload.orderId;
    const isConnected = yield select(getIsConnected); // test for this select fails because activeOrder is undefined 

Мой тест (до соответствующей точки) -

describe('test order selection flow', () => {
  const navSpy = jest.spyOn(AppNavigator, 'navigate');
  const action = {
    type: 'galactica/orders/VIEW',
    payload: {
      orderStatus: 'OPEN',
      orderId: 1
    }
  };

  afterAll(() => {
    jest.resetModules();
    navSpy.mockRestore();
  });
  it.next = sagaHelper(orderSelectionFlow(action));

  it.next('should get all orders', (result) => {
    expect(result).toEqual(select(getOrders));
  });

  it.next('should use connected state', (result) => {
    expect(result).toEqual(select(getIsConnected));
  });

Заказы в настоящее время не определены, но если бы я смогла высказать значение, это было бы

orders: { 'OPEN': { orderId: 1 } }

1 Ответ

0 голосов
/ 22 марта 2019

Я бы попробовал использовать redux-saga-tester: https://github.com/wix/redux-saga-tester.Это позволит вам указать начальное состояние в настройках.Я не совсем уверен, как выглядит весь ваш код, но я думаю, что вы могли бы сделать что-то вроде ниже.

describe('test order selection flow', () => {
  const navSpy = jest.spyOn(AppNavigator, 'navigate');
  const action = {
    type: 'galactica/orders/VIEW',
    payload: [{
      orderStatus: 'OPEN',
      orderId: 1
    }]
  };

  afterAll(() => {
    jest.resetModules();
    navSpy.mockRestore();
  });

  it('should get all orders', (result) => {
    const tester = new SagaTester({
       initialState: {
         orders: { 
           'OPEN': { 
             orderId: 1 
           } 
         }
       }
    });

    tester.start(saga);
    tester.dispatch(action);

    // ... do your expects here
    // You may need to use `tester.waitFor` to wait for an action to be dispatched
    // If you want to expect a certain action was called, use `getCalledActions`
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...