Как проверить функцию была вызвана внутри другой функции - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть форма. Когда пользователь переходит с шага 1 на шаг 2, код проверяет все обязательные поля на шаге 1, а затем перемещает пользователя на шаг 2. Когда пользователь переходит на шаг 2, 3 или 4 и нажимает кнопку Обновить или открывает URL-адрес в новом окне. , они перенаправлены на вступительную страницу.

Моя проблема - тестирование кода и что тестировать.

Я использую React, Redux, Jest и Sinon.

// actions.js

export const redirectToIntroPage = () => (dispatch, getState) => {
  const fields = {
    field1: getState().app.inputs.field1,
    field2: getState().app.inputs.field2,
    field3: getState().app.inputs.field3,
  };

  if (objHasNullValue(fields)) {
    goToPage(PAGES.INTRODUCTION);
  }
};

getState() вызывается несколько раз, потому что мне нужны только указанные ключи. app имеет множество других вещей, которые мне не нужны.

// parsing.js

export const objHasNullValue = obj => {
  for (var property in obj) {
    if (isNull(obj[property]) === true) {
      return true;
    }
  }
  return false;
};

goToPage говорит само за себя.

// action.test.js

  describe('redirect to intro page', () => {
    let sandbox, fakeDispatch, fakeState, goToPage;

    const fakeGetState = () => (fakeState);

    beforeEach(() => {
      sandbox = sinon.createSandbox();
      fakeDispatch = sandbox.stub();
      goToPage = sandbox.spy();
    });

    afterEach(() => {
      sandbox.restore();
    });

    it('should redirect if the Personalisation Form has a null value', () => {
      fakeState = {
        app: {
          inputs: {
            field1: null,
            field2: null,
            field3: null,
          },
        },
      };
      redirectToIntroPage()(fakeDispatch, fakeGetState);
      expect(goToPage.calledOnce).toBe(true);
    });

    it('shouldn\'t redirect if the Personalisation Form is complete', () => {

    });
  });

Я думаю о тестах, чтобы заглушить goToPage и проверить, что он был вызван. Я должен позвонить redirectToIntroPage()(fakeDispatch, fakeGetState), чтобы сделать это, но как мне попасть внутрь redirectToIntroPage, чтобы проверить, что goToPage был вызван?

Я посмотрел здесь , что имеет концептуальный смысл, но как мне перевести это в Синон и Шут?

Я также посмотрел здесь , что является той же идеей.

1 Ответ

0 голосов
/ 12 сентября 2018

Получите goToPage из аргументов, а не из внешней области видимости (как это трудно подделать).Разделите вашу функцию на 2:

// Use for testing
export const redirectTo = (goToPage) => () => (dispatch, getState) => {
  const fields = {
    field1: getState().app.inputs.field1,
    field2: getState().app.inputs.field2,
    field3: getState().app.inputs.field3,
  };

  if (objHasNullValue(fields)) {
    goToPage(PAGES.INTRODUCTION);
  }
};

// Use as before
export const redirectToIntroPage = redirectTo(goToPage);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...