Проверьте, что происходит, когда что-то щелкнуло (шутка)

#javascript #reactjs #typescript #jestjs #ts-jest

Вопрос:

Я начинающий шутник в react, как узнать, когда мне следует над чем-то поиздеваться? Например, внутри «ListItem» у меня есть «нажмите на меня», когда он нажат, под которым появится раскрывающийся список «камеры», поэтому, если я должен проверить, что происходит, когда нажимается «нажмите на меня» или что в нем содержится. Мне нужно посмеяться над этим или над чем-то еще? В данный момент с помощью моего кода я проверяю наличие компонента.

 import {  List,  ListItem,  ListItemText,  ListItemSecondaryAction,  Collapse,  IconButton,  MenuItem, } from "@material-ui/core/"; export const SelectionList:  interface SelectionList {  actionArgs?: string | undefined;  onUpdateClick: (e: any) =gt; void;  onDeleteClick: (e: any) =gt; void;  onDetailsClick: (e: any) =gt; void;  action: string;  name?: string;  identifier?: string;  classes: {  button_basic: string;  formControl: string;  selectionCard: string;  }; }  React.FClt;SelectionListgt; = (  props ) =gt; {  const itemListCollapseKey = props.action   "-itemlist-collapse";  const [collapseStates, setCollapseStates] = useState({  [itemListCollapseKey]: false,  });  const dispatch = useDispatch();   const handleExpandClick = (  event: React.MouseEventlt;HTMLDivElement, MouseEventgt;,  key: string  ) =gt; {  setCollapseStates({  ...collapseStates,  [key]: !collapseStates[key],  });  };   const listItems = (  key: React.Key | null | undefined,  content: SelectionList | undefined | string,  element: SelectionList  ) =gt; {  return (  lt;MenuItem  key={key}  selected={isElementSelected(element)}  button  onClick={(event) =gt; {  selectElement(element);  }}  gt;  lt;ListItemText primary={content} key={key   "-litext"}gt;lt;/ListItemTextgt;  lt;ListItemSecondaryAction  // p={1}  gt;  lt;IconButton  onClick={(e) =gt; handleDetailsClick(e, element)}  aria-label="details"  gt;  lt;/IconButtongt;  lt;/ListItemSecondaryActiongt;  lt;/MenuItemgt;  );  };      let childList: React.ReactElement | string = "";  if (data amp;amp; data.length gt; 0) {  childList = (  lt;Collapse  key={itemListCollapseKey}  in={collapseStates[itemListCollapseKey]}  unmountOnExit  gt;  {data.map((el) =gt; (  lt;List key={keyFromEl(el)   "sublist"}gt;  {listItems(keyFromEl(el), el.name, el)}  lt;/Listgt;  ))}  lt;/Collapsegt;  );  }   return (  lt;List component="div" data-testid="SelectionListt"gt;  lt;ListItem  key={props.action   "-header"}  button  onClick={(event) =gt; {  handleExpandClick(event, itemListCollapseKey);  }}  gt;  click me  lt;/ListItemgt;   {childList}  lt;/Listgt;  ); }; 

Мое тестирование:

 import "@testing-library/jest-dom/extend-expect";  function handleUpdateClick(event: any, type = "") {} test("test", () =gt; {  render(  lt;Provider store={store}gt;  lt;SelectionList  classes={{ button_basic: "", formControl: "", selectionCard: "" }}  action={"cameras"}  actionArgs={""}  onUpdateClick={handleUpdateClick}  onDeleteClick={handleUpdateClick}  onDetailsClick={handleUpdateClick}  /gt;  lt;/Providergt;  );  const SelectionCardElement = screen.getByTestId("SelectionListt");  expect(SelectionCardElement).toBeInTheDocument(); }); 

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

1. любое предложение/помощь приветствуется

Ответ №1:

Я бы посоветовал вам рассматривать компоненты как отдельные тестируемые единицы. Так что, когда вы тестируете ListItem — вы тестируете всю ListItem функциональность. Затем, когда вы тестируете свой SelectionList — вы имитируете ListItem компонент и только проверяете всю SelectionList функциональность.

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

Обновить

Я имею в виду (в псевдокоде):

 // ListItem.spec.jsx it.todo("list item renders"); it("list item triggers click callback when clicked", () =gt; {  const onClickCallback = jest.fn();  const elem = render(lt;ListItem onClick={onClickCallback} /gt;);  elem.click();  expect(onClickCallback).toHaveBeenCalledTimes(1); });  

и

 // SelectionList it.todo("selection list renders");  

Что касается того, как вы издеваетесь, самым простым способом было бы сделать что-то вроде этого:

 lt;SelectionList listItemComponent={ListItem} /gt;  

или

 lt;SelectionList listItemComponent={lt;ListItem props="bla"/gt;} /gt;  

и т.д.

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

1. не могли бы вы привести рабочий пример моего кода? Как можно издеваться над lt;ListItemgt;? чтобы знать, что происходит, когда его нажимают

2. смотрите обновление, пожалуйста

3. не могли бы вы добавить все необходимое в код, чтобы его можно было скопировать, вставить и попробовать ? например lt;Магазин поставщика={магазин}gt;lt;Магазин поставщика={магазин}gt;lt;/Поставщикgt; ? что такое «listItemComponent», что должно быть вместо него ?

4. это новая опора, которую вы можете добавить, и, к сожалению, я не могу предоставить полное решение

5. не могли бы вы показать, как добавить listItemComponent, теперь я получаю «Свойство» listItemComponent «не существует в типе» Встроенные атрибуты и опуститьlt;Список выбора, никогдаgt;».ts(2322)»