!! в шутку - PullRequest
       8

!! в шутку

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

У меня есть два следующих теста:

it('should render w/o crashing', () => {
  const onExport = jest.fn();
  const ID = 123;

  const tree = renderer.create(
    <I18nextProvider i18n={i18n}>
      <ExportButton id={ID} onExport={onExport} />
    </I18nextProvider>,
  );
  expect(tree!!.toJSON()).toMatchSnapshot();
});

и второй:

it('should handle click', () => {
  const onExport = jest.fn();
  const ID = 123;

  const tree = renderer.create(
    <I18nextProvider i18n={i18n}>
      <ExportButton id={ID} onExport={onExport} />
    </I18nextProvider>,
  );
  const buttonProps = tree.root.findByType('button').props as ButtonHTMLAttributes<
    HTMLButtonElement
  >;
  buttonProps.onClick!!({} as React.MouseEvent<HTMLButtonElement, MouseEvent>);
  expect(onExport).toBeCalledTimes(1);
  expect(onExport).toBeCalledWith(ID);
});

Вы знаете, как его улучшить, чтобы заменить синтаксис !! (tree!! и onClick!!)? Я думаю, что это не самое лучшее решение, причина этого синтаксиса в том, чтобы быть уверенным, что в этом месте не будет нулевого значения.

1 Ответ

1 голос
/ 23 апреля 2020

!! двойной удар является ошибкой, он не приводит к ошибке, поскольку допускается использование нескольких операторов, но это бесполезно, необходимо использовать один ненулевой оператор утверждения !.

В производстве это должно решаться с помощью средств защиты типов, чтобы не вызывать ошибки при компиляции и во время выполнения:

if (tree)
  expect(tree.toJSON()).toMatchSnapshot();

Но в тестовой среде предпочтительно иметь ошибку во время выполнения, потому что утверждение должно потерпеть неудачу, если оно не соответствует ожиданиям, поэтому это идеальный вариант использования для ! ненулевого утверждения:

expect(tree!.toJSON()).toMatchSnapshot();

Можно изменить типы, чтобы сделать некоторые свойства необязательными:

type ButtonType = ButtonHTMLAttributes<HTMLButtonElement>;
type ButtonTypeWithOnClick = ButtonType & Required<Pick<ButtonType, 'onClick'>>;

const buttonProps = tree.root.findByType('button').props as ButtonTypeWithOnClick;
buttonProps.onClick({} as React.MouseEvent<HTMLButtonElement, MouseEvent>);

Но результат многословен, это идеальный вариант использования для ! для одноразового утверждения, что также делает намерение более ясным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...