Как проверить избыточную форму с включенной асинхронной проверкой - PullRequest
1 голос
/ 23 апреля 2019

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

Я попытался смоделировать функцию проверки асинхронности с простым разрешенным обещанием, форма все еще не может быть отправлена.Но я удалил асинхронную проверку, форма может быть отправлена ​​без каких-либо проблем.

...
jest.mock('../../../../../../utilities/validators');

it('should set registration info and set current step with correct values when registration form is successfully submitted', () => {
    const store = createStore(
      combineReducers({
        form: formReducer,
      }),
    );

    validateEmailUnique.mockImplementation(() => Promise.resolve());

    const mockOnSetRegistrationInfo = jest.fn();
    const mockOnSetRegistrationCurrentStep = jest.fn();

    const updatedProps = {
      ...defaultProps,
      onSetRegistrationInfo: mockOnSetRegistrationInfo,
      onSetRegistrationCurrentStep: mockOnSetRegistrationCurrentStep,
    };

    const wrapper = mount(
      <Provider store={store}>
        <StepOne {...updatedProps} />
      </Provider>,
    );

    const form = wrapper.find('form');
    const businessEmailTextField = wrapper.find(
      'input#business-email-text-field',
    );

    businessEmailTextField.simulate('change', {
      target: {
        value: 'business@email.com',
      },
    });

    form.simulate('submit');

    expect(mockOnSetRegistrationInfo).toHaveBeenCalled();

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

1 Ответ

0 голосов
/ 23 апреля 2019

Проблема в том, что асинхронная проверка не завершена к тому времени, когда expect запускается и завершается неудачей.

Из того, что я вижу в вашем коде, не похоже, что у вас есть прямой доступ к Promise с шага асинхронной проверки, поэтому вы не сможете await его напрямую ...

... но если вы смоделировали какие-либо async операции для немедленного разрешения, то все они должны завершиться за один цикл очереди Promise микротрасс.

Если это так, то вы можете переместить свои утверждения к чему-то вроде setImmediate или setTimeout и использовать done, чтобы сообщить Jest о завершении теста:

it('should set registration info...', done => {  // <= use done

  // ...

  form.simulate('submit');

  setImmediate(() => {
    expect(mockOnSetRegistrationInfo).toHaveBeenCalled();  // Success!
    done();  // <= now call done
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...