Как издеваться над функцией в компоненте в шутку

#javascript #reactjs #jestjs #react-testing-library

#javascript #reactjs #jestjs #реагировать-тестирование-библиотека

Вопрос:

Я давно не проводил никаких шуток или тестов, и я борюсь с этим тестом. У меня есть этот компонент button, в котором значение атрибута disabled берется из хранилища redux. Когда пользователь входит в систему, я делаю вызов серверной части и сохраняю некоторые данные в хранилище redux, а затем во время просмотра, если пользователь попадает на эту конкретную страницу. Я считываю данные из хранилища, модифицирую их для создания объекта, а затем передаю его кнопкам.

В моем компоненте есть эти две кнопки material-ui.

 <Button onClick={handleClick} disabled={!permissions.admin|| !permissions.moderator} id="btn-reports">Reports</Button>
<Button onClick={handleClick} disabled={!permissions.admin|| !permissions.moderator} id="btn-charts">Charts</Button>
 

Родительский компонент генерирует значение объекта разрешений из вспомогательной функции getPermissions (ниже), считывающей состояние непосредственно из хранилища.

 const getPermissions = () => {
  const permissions = store.getState().permisisons;
  const accessToButtons = {
    admin: false,
    moderator: false
  }

  for(const permission of permissions) {
    if (permission.admin === true) {
     accessButtons.admin = true;
    } else if (permission.moderator === true) {
     accessButtons.moderator= true;
    }
  }

  return accessToButtons;

}
 

Прямо сейчас я получаю сообщение об ошибке при запуске jest, потому что кнопка отключена. Я считаю, что по умолчанию она имеет значение false, и я пытаюсь написать тест для проверки onclick, который завершается неудачей. У меня есть вспомогательная функция для handleDisabled, где я перебираю объект в хранилище и на основе этой кнопки отключен. Может ли кто-нибудь подсказать мне, что мне нужно здесь сделать? Как мне издеваться над функцией, предоставляя некоторые фиктивные значения для этого объекта, чтобы у меня был контроль над отключением / включением этих кнопок.
Я поиграл с jest.fn и jest.spyOn , но мне не повезло.

Спасибо.

Комментарии:

1. Итак, я решил эту проблему, добавив jest.spyOn(newlyCreatedObjectWithGetPermissions, getPermissions).mockReturnValue(mockPermissonsObject), а затем, конечно, permissonsObject имеет {admin: true, moderator: false} . Это правильный путь?

2. Я бы сказал, что с RTL чем больше вы можете взаимодействовать с тестируемым компонентом, тем лучше для кода приложения / пользовательского интерфейса и пользователя. Я не думаю, что вы должны получать состояние непосредственно из хранилища, как у вас getPermissions , но обычно у вас есть компонент, «подписывающийся» на контекст redux, предоставляемый приложению … просто создайте оболочку mock redux provider для тестируемого компонента. Если вы все еще используете connect HOC, экспортируйте и протестируйте неподключенный компонент и просто издевайтесь над реквизитами, которые будут сопоставлены с redux.