{"id":329426,"date":"2022-02-11T15:00:27","date_gmt":"2022-02-11T15:00:27","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=329426"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=329426","title":{"rendered":"<span>\u041a\u0430\u043a \u044f \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0431\u0435\u0441\u043f\u043e\u043a\u043e\u0438\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u043b\u044e\u0431\u0438\u043b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 React-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"688\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/77d\/44f\/6d6\/77d44f6d63e7adde37300ac59b8f207d.png\" data-width=\"1200\"\/><figcaption><\/figcaption><\/figure>\n<p><em>\u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c React-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b? \u041a\u0430\u043a\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c? \u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0435\u0440\u0443\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 Redux, \u0430 \u043d\u0435 \u0438\u0437 \u043f\u0440\u043e\u043f\u0441\u043e\u0432? \u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u043e\u0443\u0442\u0438\u043d\u0433 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e React-router-dom? \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0435\u0441\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434?<\/em><\/p>\n<p>&#8230;\u041c\u043e\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442.\u00a0\u042f, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0441\u0442\u0430\u043b \u0433\u0443\u0433\u043b\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 React-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 Redux \u0438 React-router-dom, \u0438 \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0432 \u0441\u0435\u0442\u0438 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u043e \u043c\u0430\u043b\u043e \u043a\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442, \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b. \u0410 \u0435\u0441\u043b\u0438 \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442, \u0442\u043e \u0432\u00a0 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u043d\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445. \u041c\u043d\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u0441\u0442\u0430\u0442\u044c\u0438, \u0432\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0433 \u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0442\u0435\u0441\u0442 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0435 \u0441\u0430\u043c.<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0436\u0435, \u043a\u0430\u043a \u044f: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0448\u043b\u0438 \u043d\u0430 \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b. \u0411\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u0433 \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043e\u0438 \u0432\u044b\u0432\u043e\u0434\u044b, \u0434\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u044b \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f.<\/p>\n<h3>React-testing-library<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 <a href=\"https:\/\/github.com\/daneelzam\/react-test\"><u>React-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/u><\/a>: \u043c\u0435\u043d\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u0441 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u043c, \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0435 Send \u0444\u043e\u0440\u043c\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0435\u043d\u0435\u0433 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439, \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0438, \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0441 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u043c \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438, \u0441 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0440\u044f\u0434\u0430 \u043e\u0448\u0438\u0431\u043e\u043a. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0443\u0441\u043f\u0435\u0445\u0430.<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"1150\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d4c\/53b\/47b\/d4c53b47bd2ee216edebad5d35b12bef.gif\" data-width=\"1338\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/testing-library.com\/docs\/react-testing-library\/intro\"><u>react-testing-library<\/u><\/a>, \u0430 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 TypeScript. React-testing-library \u2014 \u044d\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/testing-library.com\/\"><u>Testing Library<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043b\u044f React \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432 \u0441\u0432\u043e\u0435\u0439 \u043e\u0441\u043d\u043e\u0432\u0435 <a href=\"https:\/\/jestjs.io\/\"><u>Jest<\/u><\/a>. \u0412\u0441\u0435 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0443:<\/p>\n<pre><code class=\"javascript\">import { render, screen } from '@testing-library\/react'; import Send from '.\/index';   test('From element: exist in the DOM, () => {   render(&lt;Send \/>)   expect(screen.getByLabelText&lt;HTMLSelectElement>('From')).toBeInTheDocument(); });<\/code><\/pre>\n<p><strong>\u0422\u0435\u0441\u0442<\/strong> \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430 \u0438 callback-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 callback \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>render,<\/strong> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 React-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0435\u0442 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>expect, <\/strong>\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p><code>expect(&lt;\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435>).toBe(&lt;\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435>);<\/code><\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u043c\u0435\u043d\u044e \u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\u043c\u0438 <code>&lt;\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435><\/code> \u0431\u044b\u043b\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043e \u0432 HTML-\u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0435 <code>&lt;\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435>.<\/code><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <strong>screen,<\/strong> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 DOM-\u0434\u0435\u0440\u0435\u0432\u043e\u043c. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u00abgetByLabelText\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u0442\u0435\u0433\u043e\u043c <code>&lt;label><\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u00abFrom\u00bb.<\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>.toBeInTheDocument()<\/code>.<\/p>\n<p><em>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b \u0442\u0435\u0441\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a: \u00ab\u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043b\u0435\u0439\u0431\u043b\u043e\u043c \u201cFrom\u201d\u00bb.<\/em><\/p>\n<p>\u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 screen \u0438 \u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u044f\u043c.<\/p>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 DOM-\u0434\u0435\u0440\u0435\u0432\u043e\u043c<\/h4>\n<p>\u0423 react-testing-library \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e DOM. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u043d.\u00a0<\/p>\n<p>\u041f\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u0435\u0441\u0442\u0430 \u0432\u044b\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u0449\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c DOM-\u0434\u0435\u0440\u0435\u0432\u0435 \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\u00a0<\/p>\n<p>\u0410 \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u043f\u0443\u043d\u043a\u0442\u0430 \u0441 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430? \u0415\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438 \u0437\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0441\u0447\u0435\u0442 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u0433\u0438\u043a\u0443, \u041d\u041e \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438 \u0432 DOM-\u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e state \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0435 \u2014 \u0442\u043e, \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u2014 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430\u0448\u0438\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f\u043c. \u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439.<\/p>\n<p>\u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u0440\u0430\u0432\u043d\u0430 1% \u043e\u0442 \u0441\u0443\u043c\u043c\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430:<\/p>\n<pre><code class=\"javascript\">import { render, screen } from '@testing-library\/react'; import Send from '.\/index';   test('Fee element: value was changed after change of amount value', () => {   render(&lt;Send \/>)   userEvent.type(screen.getByLabelText&lt;HTMLInputElement>('Amount'), '1')   expect(screen.getByLabelText&lt;HTMLInputElement>('Fee').value).toBe('0.01'); }) <\/code><\/pre>\n<p><em>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430: \u00ab\u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0432\u0435\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u201c1\u201d \u0432 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0441 \u043b\u0435\u0439\u0431\u043b\u043e\u043c \u201cAmount\u201d, \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0441 \u043b\u0435\u0439\u0431\u043b\u043e\u043c \u201cFee\u201d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e 0.01\u00bb.\u00a0<\/em><\/p>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0432\u0430\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 React Testing Library \u2014 <strong>userEvent<\/strong>. \u041e\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 DOM, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u044b \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u00a0\u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c:<\/p>\n<p><code>userEvent.type(&lt;\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u044e\u0437\u0435\u0440>, \u00ab\u0442\u0435\u043a\u0441\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d \u0432\u0432\u043e\u0434\u0438\u0442\u00bb)<\/code>\u00a0<\/p>\n<p>\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443:<\/p>\n<p><code>userEvent.click(&lt;\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u044e\u0437\u0435\u0440>)<\/code><\/p>\n<p>\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p><em>\u0414\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0443\u043c\u0430\u0435\u0442 \u043e \u043b\u043e\u0433\u0438\u043a\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u0438 \u0441\u0442\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u044e\u0437\u0435\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u043a-\u0442\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0435, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/em><\/p>\n<h4>\u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430, \u0443\u0433\u043b\u0443\u0431\u0438\u043c\u0441\u044f \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438.\u00a0<\/p>\n<p>\u041f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e DOM-\u0434\u0435\u0440\u0435\u0432\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 screen, \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438:\u00a0<\/p>\n<p>1. getBy \u2014 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435;<\/p>\n<p>2. queryBy \u2014 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435;<\/p>\n<p>3. findBy \u2014 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 getBy \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, \u0442\u043e \u0434\u0432\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 queryBy. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0435\u0441\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0435\u043d\u0435\u0433. \u0415\u0441\u043b\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0430, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430:<\/p>\n<figure class=\"full-width\"><img decoding=\"async\" src=\"\/img\/image-loader.svg\" height=\"1150\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c9b\/aff\/0da\/c9baff0da166adc1c75437f923ac12b4.png\" data-width=\"1338\"\/><figcaption><\/figcaption><\/figure>\n<pre><code class=\"javascript\">{error.status &amp;&amp; (   &lt;div className=\"error\">     {error.message}   &lt;\/div> )} <\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0448\u0435\u043b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u043d\u0430\u0448\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c, \u043e\u043d \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c queryBy:<\/p>\n<pre><code class=\"javascript\">test('Error element: not to be in the component by default', async ()=> {   render(&lt;Send \/>)   expect(screen.queryByText('Error')).not.toBeInTheDocument(); }) <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 <code>expect<\/code> \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>NotToBeInTheDocument<\/code>). \u0412\u0441\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>.not<\/code> \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c. \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f getBy, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 \u0442\u0435\u0441\u0442\u0430 \u2014 \u043e\u043d \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u2014 findBy \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u043c\u0435\u043d\u0438 \u044e\u0437\u0435\u0440\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e:<\/p>\n<pre><code class=\"javascript\">const getUser = () => Promise.resolve({ id: '1', name: 'John Doe' })<\/code><\/pre>\n<p>\u0410 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u044e\u0437\u0435\u0440\u0435:<\/p>\n<pre><code>{user &amp;&amp; &lt;div>Hello {user.name}&lt;\/div>}<\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u0442\u0443\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c findBy:<\/p>\n<pre><code class=\"javascript\">test('User element: exist after fetch data', async function () {  \u00a0\u00a0render(&lt;Send \/>)  \u00a0\u00a0expect(await screen.findByText(\/Hello\/)).toBeInTheDocument()  });<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u043e \u0438 callback-\u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u0430\u044f \u0432 \u0442\u0435\u0441\u0442, \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439.<\/p>\n<p>\u0412\u043e\u0442 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>getBy<\/p>\n<\/td>\n<td>\n<p>queryBy<\/p>\n<\/td>\n<td>\n<p>findBy<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByText<\/p>\n<\/td>\n<td>\n<p>queryByText<\/p>\n<\/td>\n<td>\n<p>findByText<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByRole<\/p>\n<\/td>\n<td>\n<p>queryByRole<\/p>\n<\/td>\n<td>\n<p>findByRole<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByLabelText<\/p>\n<\/td>\n<td>\n<p>queryByLabelText<\/p>\n<\/td>\n<td>\n<p>findByLabelText<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByPlaceholderText<\/p>\n<\/td>\n<td>\n<p>queryByPlaceholderText<\/p>\n<\/td>\n<td>\n<p>findByPlaceholderText<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByAltText<\/p>\n<\/td>\n<td>\n<p>queryByAltText<\/p>\n<\/td>\n<td>\n<p>findByAltText<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByDisplayValue<\/p>\n<\/td>\n<td>\n<p>queryByDisplayValue<\/p>\n<\/td>\n<td>\n<p>findByDisplayValue<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByTestId<\/p>\n<\/td>\n<td>\n<p>queryByTestId<\/p>\n<\/td>\n<td>\n<p>findByTestId<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByTitle<\/p>\n<\/td>\n<td>\n<p>queryByTitle<\/p>\n<\/td>\n<td>\n<p>findByTitle<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0434\u0432\u0443\u0445:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0440\u043e\u043b\u0438 (getByRole, queryByRole, findByRole). \u041f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0435\u0433\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u043e\u043b\u0438 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435. \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u043e\u043b\u0438:<\/p>\n<\/li>\n<\/ol>\n<p>\u2018combobox\u2019 &#8212; \u0442\u0435\u0433 <code>&lt;select \/><\/code><\/p>\n<p>\u2018button\u2019 &#8212; \u0442\u0435\u0433 <code>&lt;button \/><\/code> \u0438\u043b\u0438 <code>&lt;input type=\u00absubmit\u00bb \/><\/code><\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f getByRole:<\/p>\n<pre><code>userEvent.click(screen.getByRole('button'));\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u041f\u043e\u0438\u0441\u043a \u043f\u043e testId. \u0412 \u043a\u043e\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 data-\u0430\u0442\u0440\u0438\u0431\u0443\u0442 testId \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430:<\/p>\n<\/li>\n<\/ol>\n<pre><code>&lt;div data-testid=\"custom-element\" \/><\/code><\/pre>\n<p>\u0423 \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0435\u0441\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435:<\/p>\n<ul>\n<li>\n<p>get<strong>All<\/strong>ByText<\/p>\n<\/li>\n<li>\n<p>query<strong>All<\/strong>ByPlaceholderText<\/p>\n<\/li>\n<li>\n<p>find<strong>All<\/strong>ByTestId<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0442.\u0434. \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<h4>\u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041e\u043d\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430:<\/p>\n<pre><code>expect(&lt;\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435>).toBe(&lt;\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435>);<\/code><\/pre>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0430\u0440\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 expect:<\/p>\n<ul>\n<li>\n<p><strong>toBeNull:<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><code>expect(screen.queryByText(\/Hello\/)).toBeNull();<\/code><\/p>\n<p><em>\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d null<\/em><\/p>\n<ul>\n<li>\n<p><strong>toBeInTheDocument:<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><code>expect(await screen.findByText(\/Hello\/)).toBeInTheDocument()<\/code><\/p>\n<p><em>\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0435\u0441\u0442\u044c \u0432 DOM<\/em><\/p>\n<ul>\n<li>\n<p><strong>toBeTruthy:<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><code>expect(screen.getByLabelText&lt;HTMLInputElement>('Fee').disabled).toBeTruthy();<\/code><\/p>\n<p><em>\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0441 \u043b\u0435\u0439\u0431\u043b\u043e\u043c &#171;Fee&#187; \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430<\/em><\/p>\n<ul>\n<li>\n<p><strong>toHaveTextContent:<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><code>expect(screen.getByText&lt;HTMLSpanElement>(\/balance\/i)).toHaveTextContent('10');<\/code><\/p>\n<p><em>\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u043a\u0441\u0442 &#171;balance&#187;, \u0431\u0443\u0434\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 &#8217;10&#8217;\u00a0<\/em><\/p>\n<ul>\n<li>\n<p><strong>toBe:<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><code>expect(state[0].balance).toBe(4.95);<\/code><\/p>\n<p><em>\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043e\u0434\u043d\u0430 \u0446\u0438\u0444\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0446\u0438\u0444\u0440\u0435 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0430\u043b\u0430\u043d\u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u0438\u0437 state \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d 4.95)<\/em><\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 Jest, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <a href=\"https:\/\/jestjs.io\/docs\/expect\"><u>jest<\/u><\/a>.<\/p>\n<p>\u0412 \u0447\u0435\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u043e\u0434 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439, \u0445\u043e\u0442\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>.toBe()<\/code> \u0438 \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f?\u00a0<\/p>\n<p>\u0418\u0445 \u0434\u0432\u0430: \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u0447\u043b\u0435\u043d\u043e\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0434\u0430\u0436\u0435 \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430 \u0438 \u0442\u0435\u0441\u0442\u043e\u0432, \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043b\u043e\u0433\u0430\u0445, \u0435\u0441\u043b\u0438 \u0442\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u0441\u044f.<\/p>\n<h4>userEvent \u0438 fireEvent<\/h4>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, <a href=\"https:\/\/github.com\/testing-library\/user-event\"><u>userEvent<\/u><\/a> \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u0432\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e. \u0412\u043e\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u200b\u200bclick &#8212; \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442;<\/p>\n<\/li>\n<li>\n<p>dblClick &#8212; \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442;<\/p>\n<\/li>\n<li>\n<p>type &#8212; \u043f\u0435\u0447\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>clear &#8212; \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 (\u0442\u043e\u043b\u044c\u043a\u043e <code>&lt;input\/><\/code> \u0438 <code>&lt;select\/><\/code>);<\/p>\n<\/li>\n<li>\n<p>tab &#8212; \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 tab;<\/p>\n<\/li>\n<li>\n<p>hover &#8212; \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043c\u044b\u0448\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>unhover &#8212; \u0441\u043d\u044f\u0442\u0438\u0435 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043c\u044b\u0448\u043a\u0438;<\/p>\n<\/li>\n<li>\n<p>upload &#8212; \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u0430;<\/p>\n<\/li>\n<li>\n<p>selectOptions &#8212; \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 (<code>&lt;select \/><\/code>);<\/p>\n<\/li>\n<li>\n<p>deselectOptions -\u0443\u0431\u0440\u0430\u0442\u044c \u0432\u044b\u0431\u043e\u0440 ;<\/p>\n<\/li>\n<li>\n<p>paste &#8212; \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430;<\/p>\n<\/li>\n<li>\n<p>keyboard &#8212; \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448;<\/p>\n<\/li>\n<\/ul>\n<p><a href=\"https:\/\/testing-library.com\/docs\/ecosystem-user-event\"><u>\u0421\u0441\u044b\u043b\u043a\u0430<\/u><\/a> \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0443\u044e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e.<\/p>\n<p>\u0424\u0438\u043b\u043e\u0441\u043e\u0444\u0438\u044f react-testing-library \u0443\u0447\u0438\u0442 \u043d\u0430\u0441, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0442\u0440\u0435\u043c\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c userEvent \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0447\u0430\u0449\u0435 \u0434\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f. \u041d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 userEvent \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442. \u0422\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f \u043a fireEvent. \u041f\u043e \u0444\u0430\u043a\u0442\u0443, userEvent \u2014 \u044d\u0442\u043e \u043e\u0431\u043e\u043b\u043e\u0447\u043a\u0430 \u043d\u0430\u0434 fireEvent, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0438. \u0410 \u0432\u043e\u0442 <a href=\"https:\/\/testing-library.com\/docs\/dom-testing-library\/api-events\/#fireevent\"><u>fireEvent<\/u><\/a> \u2014 \u044d\u0442\u043e \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u044f \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f DOM-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\u00a0<\/p>\n<p>\u0412\u043e\u0437\u044c\u043c\u0435\u043c \u043c\u0435\u0442\u043e\u0434 type \u0443 userEvent \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u043c \u0441 \u0442\u0435\u043c \u0436\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c \u0432 fireEvent:<\/p>\n<ul>\n<li>\n<p>userEvent:<\/p>\n<\/li>\n<\/ul>\n<p><code>userEvent.type(screen.getByLabelText&lt;HTMLInputElement>('Amount'), '10')<\/code><\/p>\n<ul>\n<li>\n<p>fireEvent:<\/p>\n<\/li>\n<\/ul>\n<p><code>fireEvent.change(screen.getByLabelText&lt;HTMLInputElement>('Amount'), {target: { value: '10' }});<\/code><\/p>\n<p>fireEvent \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: \u044d\u043b\u0435\u043c\u0435\u043d\u0442 DOM-\u0434\u0435\u0440\u0435\u0432\u0430 \u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441\u043e\u0431\u044b\u0442\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441 \u043d\u0438\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442.\u00a0 fireEvent \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u2014\u00a0 &#171;keyPress&#187;, &#171;focusOut&#187;, &#171;drag&#187; \u2014 \u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u044f \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0438\u0445 <a href=\"https:\/\/github.com\/testing-library\/dom-testing-library\/blob\/main\/types\/events.d.ts\"><u>\u0442\u0438\u043f\u0430\u0445<\/u><\/a>.\u00a0<\/p>\n<h4>Redux<\/h4>\n<p>\u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u0435\u0441\u043b\u0438 \u043e\u043d \u0431\u0435\u0440\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 Redux-\u0441\u0442\u043e\u0440\u0430? \u041d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 store, \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043d\u0443\u0442\u0440\u044c \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f renderWithRedux \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c, \u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d. \u0412\u043d\u0443\u0442\u0440\u0438 \u0441\u0435\u0431\u044f \u043e\u043d\u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 store \u0438 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0435\u0433\u043e\u043c <code>&lt;Provider\/><\/code>, \u043a\u0443\u0434\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 store. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435: \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u043d\u0434\u0435\u0440 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430, \u043d\u043e \u0438 \u0441\u0430\u043c store.<\/p>\n<pre><code class=\"javascript\">mport { createStore } from \"redux\"; import { Provider } from \"react-redux\"; import { reducer, WalletItem } from \"..\/..\/redux\/store\";   const renderWithRedux = (   component: JSX.Element,   { initialState,     store = createStore(reducer, initialState)   }: {initialState?: WalletItem[]; store?: any } = {} ) => {   return {     ...render((         &lt;Provider store={store}>           {component}         &lt;\/Provider>,     store   } } <\/code><\/pre>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445.<\/p>\n<pre><code class=\"javascript\">test('From element: default value is the first wallet', function () { const { store } = renderWithRedux(&lt;Send \/>, { initialState: MOCK_WALLET_LIST}) const state = store.getState(); expect(screen.getByLabelText&lt;HTMLSelectElement>('From').value).toBe(state[0].id.toString()); });<\/code><\/pre>\n<p><em>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430: \u00ab\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0441 \u043b\u0435\u0439\u0431\u043b\u043e\u043c &#171;From&#187; \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e &#171;id&#187; \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\u00bb.<\/em><\/p>\n<p>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u044e renderWithRedux \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f store. \u042d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0441\u0442\u043e\u0440 Redux, \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c state \u0438 \u043c\u043e\u0436\u0435\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c, \u043a\u0430\u043a \u043e\u043d \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"javascript\">test('SendTransaction: balances were changed after sending funds',\u00a0 () => { \u00a0\u00a0const { store } = renderWithRedux(&lt;Send \/>, { initialState: MOCK_WALLET_LIST}) \u00a0\u00a0const state = store.getState(); \u00a0\u00a0userEvent.type(screen.getByLabelText&lt;HTMLInputElement>('Amount'), '5') \u00a0\u00a0userEvent.click(screen.getByRole('button')); \u00a0\u00a0expect(state[0].balance).toBe(4.95); \u00a0\u00a0expect(state[1].balance).toBe(12); })<\/code><\/pre>\n<p><em>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430: \u00ab\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0432\u0435\u043b \u0432 \u043f\u043e\u043b\u0435 Amount \u0441\u0442\u0440\u043e\u043a\u0443 &#171;5&#187; \u0438 \u043d\u0430\u0436\u0430\u043b \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0434\u0435\u043d\u0435\u0433, \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0430\u043b\u0430\u043d\u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d &#171;4.95&#187;, \u0430 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u2014 &#171;12&#187;\u00bb.\u00a0<\/em><\/p>\n<p><strong>\u0412\u0410\u0416\u041d\u041e! <\/strong>\u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u043e\u0434\u043d\u0438\u043c \u0441\u0442\u043e\u0440\u043e\u043c. \u0415\u0441\u043b\u0438 \u0432\u044b \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0442\u0435\u0441\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438 \u0441\u0442\u043e\u0440 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043b\u0438 \u0434\u0435\u043d\u044c\u0433\u0438 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439), \u0442\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0442\u0435\u0441\u0442\u0430\u0445 \u0431\u0430\u043b\u0430\u043d\u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e.<\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f renderWithRedux \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u0432\u0430\u043c\u0438 \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u0432\u0430\u0436\u043d\u0430, \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043b\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0430\u0439\u0434\u0435\u0440\u043e\u043c \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043c. \u041e\u0434\u043d\u0430\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0435 \u043c\u043d\u043e\u0439 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0432\u0441\u0435\u043c\u0435\u0441\u0442\u043d\u043e. \u0421\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442. \u041d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u043d\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0447\u0430\u0441\u0442\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438.<\/p>\n<h4>Router<\/h4>\n<p>\u0418\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u043e\u0443\u0442\u0438\u043d\u0433 \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u0434\u0440\u0435\u0441\u0430, \u043a\u0443\u0434\u0430 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043d\u043e \u0438 \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 navigate \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435:<\/p>\n<pre><code class=\"javascript\">const navigate = useNavigate(); \u2026 navigate('\/success');<\/code><\/pre>\n<p>\u0414\u043b\u044f \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432 <a href=\"https:\/\/v5.reactrouter.com\/web\/api\/MemoryRouter\"><u>&lt;MemoryRouter\/><\/u><\/a>. \u042d\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u043e\u043c \u0432\u043d\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u041e\u043d \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u0441\u0442\u043e\u0440\u0438\u044e &#171;URL&#187;. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u043f\u0438\u0448\u0435\u0442 \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0438 \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u0442 \u0438\u0437 \u043d\u0435\u0435, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435\u0442.<\/p>\n<pre><code class=\"javascript\">const renderWithRouter = (   component: JSX.Element ) => (     render((       &lt;MemoryRouter>           {component}       &lt;\/MemoryRouter>)) )<\/code><\/pre>\n<p>\u00a0\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0435\u0441\u0442\u044c \u0442\u0440\u0438 \u0440\u043e\u0443\u0442\u0430:<\/p>\n<ul>\n<li>\n<p>&#171;\/&#187; \u2014 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 &#171;Welcome&#187;;<\/p>\n<\/li>\n<li>\n<p>&#171;\/send&#187; \u2014 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 &#171;Send&#187;;<\/p>\n<\/li>\n<li>\n<p>&#171;\/success&#187; \u2014 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 &#171;Success&#187;;<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0440\u043e\u0443\u0442\u0438\u043d\u0433\u043e\u043c, \u043d\u043e \u0438 \u0441 Redux. \u0422\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f renderWithReduxAndRouter:<\/p>\n<pre><code class=\"javascript\">const renderWithReduxAndRouter = (   component: JSX.Element,   { initialState,     store = createStore(reducer, initialState)   }: {initialState?: WalletItem[]; store?: any } = {} ) => {   return {     ...render((       &lt;MemoryRouter>         &lt;Provider store={store}>           {component}         &lt;\/Provider>       &lt;\/MemoryRouter>)),     store   } } <\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0440\u043e\u0443\u0442\u0438\u043d\u0433, \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &lt;NavBar\/> \u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"javascript\">import React from 'react'; import {Link, Route, Routes} from \"react-router-dom\"; import Send from \".\/send\"; import Success from \".\/success\"; import Welcome from \".\/welcome\";   function NavBar() {   return (     &lt;div>       &lt;nav className=\"navbar\">         &lt;Link className=\"navbarLink\" to='\/'>Welcome&lt;\/Link>         &lt;Link className=\"navbarLink\" to='\/send'>Send&lt;\/Link>       &lt;\/nav>       &lt;Routes>         &lt;Route path={'\/'} element={&lt;Welcome\/>}\/>         &lt;Route path={'\/send'} element={&lt;Send\/>}\/>         &lt;Route path='\/success' element={&lt;Success\/>}\/>       &lt;\/Routes>     &lt;\/div>   ); }   export default NavBar;<\/code><\/pre>\n<p>\u0422\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0432\u0441\u0435 \u0442\u0440\u0438 \u0440\u043e\u0443\u0442\u0430:<\/p>\n<pre><code class=\"javascript\">test('First element is Welcome page', () => {   renderWithReduxAndRouter(&lt;NavBar\/>, { initialState: MOCK_WALLET_LIST })   expect(screen.getByText('Welcome!')).toBeInTheDocument(); }) <\/code><\/pre>\n<p><em>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430: &#171;\u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u0438\u0434\u0438\u0442 \u044e\u0437\u0435\u0440 \u2014 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f&#187;.<\/em><\/p>\n<pre><code class=\"javascript\">test('After clicking the \"Send\" link, the \"Send\" page opens.', () => {   renderWithReduxAndRouter(&lt;NavBar\/>, { initialState: MOCK_WALLET_LIST })   userEvent.click(screen.getByText('Send'));   expect(screen.getByRole('button')).toBeInTheDocument() }) <\/code><\/pre>\n<p><em>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430: &#171;\u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u0441\u0441\u044b\u043b\u043a\u0443 &#171;Send&#187; \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432&#187;.<\/em><\/p>\n<pre><code> test('After clicking the \"Confirm\" button, the \"Success\" page opens.', () => {   const { store } = renderWithReduxAndRouter(&lt;NavBar\/>, { initialState: MOCK_WALLET_LIST })   const state = store.getState();   userEvent.click(screen.getByText('Send'));   userEvent.selectOptions(screen.getByLabelText&lt;HTMLSelectElement>('From'), state[3].id.toString())   userEvent.selectOptions(screen.getByLabelText&lt;HTMLSelectElement>('To'), state[4].id.toString())   userEvent.type(screen.getByLabelText('Amount'), '1');   userEvent.click(screen.getByRole('button'));   expect(screen.getByTestId('success')).toBeInTheDocument() }) <\/code><\/pre>\n<p><em>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430: &#171;\u041f\u043e\u0441\u043b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0443\u0441\u043f\u0435\u0445\u0430&#187;.<\/em><\/p>\n<p>\u041d\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439 \u0431\u044b\u043b\u0438 \u0432\u044b\u0431\u0440\u0430\u043d\u044b \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0438 4 \u0438 5. \u0412\u0441\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0442\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u043c\u0435\u043d\u044f\u0435\u0442 \u0431\u0430\u043b\u0430\u043d\u0441\u044b \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432. \u0410 \u0441\u0442\u043e\u0440 \u0443 \u043d\u0430\u0441 \u0435\u0434\u0438\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0442\u0435\u0441\u0442\u043e\u0432. \u0417\u043d\u0430\u0447\u0438\u0442, \u043d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441\u044b \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445, \u043b\u0438\u0431\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0435\u0441\u0442\u0430\u0445.<\/p>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>\u041f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b \u2014 \u043d\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438: \u0440\u043e\u0443\u0442\u0435\u0440, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u0434\u0430\u043d\u043d\u044b\u0435, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u0441\u043f\u043e\u0440\u0430\u0445 \u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u043e\u043c\u0430\u043d\u043e \u043d\u0435\u043c\u0430\u043b\u043e \u043a\u043e\u043f\u0438\u0439, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e, \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0430 \u044d\u0442\u043e\u0442 \u0432\u043e\u043f\u0440\u043e\u0441 \u0432\u044b \u0441\u0435\u0431\u0435 \u0443\u0436\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b\u0438.<\/p>\n<p>\u0412 \u0441\u0432\u043e\u0439 \u043f\u0435\u0440\u0432\u044b\u0439 \u0440\u0435\u043b\u0438\u0437 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043e\u0434\u043d\u043e \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u0432 Redux \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u0431\u0443\u043a\u0432\u0430\u043c\u0438, \u0430 \u043d\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u043c\u0438, \u043a\u0430\u043a \u0431\u044b\u043b\u043e \u0434\u043e \u044d\u0442\u043e\u0433\u043e. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u043b\u043e\u043c\u0430\u043b \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u0435\u043d \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443. \u041f\u0440\u0438\u0432\u0435\u0442, \u0441\u0440\u043e\u0447\u043d\u044b\u0439 hotfix \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430 \u0440\u0435\u043b\u0438\u0437\u043e\u043c \u0434\u0435\u043d\u044c. \u0412 \u044d\u0442\u043e\u0442 \u0434\u0435\u043d\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u044f \u0441\u0435\u0431\u0435 \u043e\u0442\u0432\u0435\u0442\u0438\u043b.<\/p>\n<h4>\u041f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/h4>\n<p>\u041a\u0440\u043e\u043c\u0435 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b \u043f\u0440\u044f\u043c\u043e \u0432 \u0442\u0435\u043a\u0441\u0442\u0435, \u043f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0443\u0447\u0430\u044e\u0449\u0438\u0445 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u043e\u0432, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0445\u043e\u0447\u0443 \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u0442\u044c:<\/p>\n<p>&#8212; <a href=\"https:\/\/www.robinwieruch.de\/react-testing-library\/\"><u>\u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435\u00a0<\/u><\/a><\/p>\n<p>&#8212; <a href=\"https:\/\/www.youtube.com\/watch?v=n79PMyqcCJ8&amp;t=3294s\"><u>\u0432\u0438\u0434\u0435\u043e \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435<\/u><\/a><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c <a href=\"https:\/\/github.com\/daneelzam\/react-test\"><u>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c<\/u><\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u0422\u0430\u043c 27 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432, \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043e\u0448\u043b\u0438 \u0432 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/div>\n<p> <!----> <!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/elbrusbootcamp\/blog\/651033\/\"> https:\/\/habr.com\/ru\/company\/elbrusbootcamp\/blog\/651033\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><em>\u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c React-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b? \u041a\u0430\u043a\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c? \u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0435\u0440\u0443\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 Redux, \u0430 \u043d\u0435 \u0438\u0437 \u043f\u0440\u043e\u043f\u0441\u043e\u0432? \u041a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u043e\u0443\u0442\u0438\u043d\u0433 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e React-router-dom? \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0432 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0435 \u0435\u0441\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 \u043a\u043e\u0434?<\/em><\/p>\n<p>&#8230;\u041c\u043e\u0438 \u0432\u043e\u043f\u0440\u043e\u0441\u044b, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043b\u0438 \u043f\u043e\u043a\u0440\u044b\u0442\u044c \u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442.\u00a0\u042f, \u0440\u0430\u0437\u0443\u043c\u0435\u0435\u0442\u0441\u044f, \u0441\u0442\u0430\u043b \u0433\u0443\u0433\u043b\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 React-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432 \u0441\u0432\u044f\u0437\u043a\u0435 \u0441 Redux \u0438 React-router-dom, \u0438 \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0432 \u0441\u0435\u0442\u0438 \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u0437\u0430\u0447\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043d\u043e \u043c\u0430\u043b\u043e \u043a\u0442\u043e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442, \u043a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b. \u0410 \u0435\u0441\u043b\u0438 \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442, \u0442\u043e \u0432\u00a0 \u043e\u0431\u0449\u0438\u0445 \u0447\u0435\u0440\u0442\u0430\u0445 \u043d\u0430 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445. \u041c\u043d\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u043b\u043e \u0441\u0442\u0430\u0442\u044c\u0438, \u0432\u043e\u043e\u0440\u0443\u0436\u0438\u0432\u0448\u0438\u0441\u044c \u043a\u043e\u0442\u043e\u0440\u043e\u0439, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0433 \u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0442\u0435\u0441\u0442 \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0440\u0435\u0448\u0438\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0435 \u0441\u0430\u043c.<\/p>\n<p>\u0421\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u0436\u0435, \u043a\u0430\u043a \u044f: \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u0448\u043b\u0438 \u043d\u0430 \u0441\u0432\u043e\u044e \u043f\u0435\u0440\u0432\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0432\u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0438\u0441\u044c \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b. \u0411\u043e\u043b\u0435\u0435 \u043e\u043f\u044b\u0442\u043d\u044b\u0445 \u043a\u043e\u043b\u043b\u0435\u0433 \u043f\u0440\u043e\u0448\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043c\u043e\u0438 \u0432\u044b\u0432\u043e\u0434\u044b, \u0434\u0430\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u044b \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u044f.<\/p>\n<h3>React-testing-library<\/h3>\n<p>\u0414\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 <a href=\"https:\/\/github.com\/daneelzam\/react-test\"><u>React-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435<\/u><\/a>: \u043c\u0435\u043d\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u0441 \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435\u043c, \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0435 Send \u0444\u043e\u0440\u043c\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0435\u043d\u0435\u0433 \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439, \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0438, \u0432\u0432\u043e\u0434\u0438\u0442\u044c \u0441\u0443\u043c\u043c\u0443 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 \u0441 \u0440\u0430\u0441\u0447\u0435\u0442\u043e\u043c \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438, \u0441 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0440\u044f\u0434\u0430 \u043e\u0448\u0438\u0431\u043e\u043a. \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d \u0443\u0441\u043f\u0435\u0445\u0430.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/testing-library.com\/docs\/react-testing-library\/intro\"><u>react-testing-library<\/u><\/a>, \u0430 \u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u043d\u0430 TypeScript. React-testing-library \u2014 \u044d\u0442\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <a href=\"https:\/\/testing-library.com\/\"><u>Testing Library<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043b\u044f React \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432 \u0441\u0432\u043e\u0435\u0439 \u043e\u0441\u043d\u043e\u0432\u0435 <a href=\"https:\/\/jestjs.io\/\"><u>Jest<\/u><\/a>. \u0412\u0441\u0435 \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0438\u0436\u0435, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043a \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0443:<\/p>\n<pre><code class=\"javascript\">import { render, screen } from '@testing-library\/react'; import Send from '.\/index';   test('From element: exist in the DOM, () => {   render(&lt;Send \/>)   expect(screen.getByLabelText&lt;HTMLSelectElement>('From')).toBeInTheDocument(); });<\/code><\/pre>\n<p><strong>\u0422\u0435\u0441\u0442<\/strong> \u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0434\u0432\u0430 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430: \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430 \u0438 callback-\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441 \u043b\u043e\u0433\u0438\u043a\u043e\u0439.<\/p>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 callback \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <strong>render,<\/strong> \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 React-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0435\u0442 \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u2014 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <strong>expect, <\/strong>\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p><code>expect(&lt;\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435>).toBe(&lt;\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435>);<\/code><\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0435 \u043c\u0435\u043d\u044e \u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430\u043c\u0438 <code>&lt;\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435><\/code> \u0431\u044b\u043b\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043e \u0432 HTML-\u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0435 <code>&lt;\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435>.<\/code><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 <strong>screen,<\/strong> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438. \u041e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 DOM-\u0434\u0435\u0440\u0435\u0432\u043e\u043c. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u0442\u043e\u0434 \u00abgetByLabelText\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d \u0441 \u0442\u0435\u0433\u043e\u043c <code>&lt;label><\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u00abFrom\u00bb.<\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u0434\u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b\u0437\u043e\u0432\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>.toBeInTheDocument()<\/code>.<\/p>\n<p><em>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u044b\u0439 \u0441\u043c\u044b\u0441\u043b \u0442\u0435\u0441\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0442\u0430\u043a: \u00ab\u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u043d\u0434\u0435\u0440\u0430 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043b\u0435\u0439\u0431\u043b\u043e\u043c \u201cFrom\u201d\u00bb.<\/em><\/p>\n<p>\u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430 screen \u0438 \u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u044f\u043c.<\/p>\n<h4>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 DOM-\u0434\u0435\u0440\u0435\u0432\u043e\u043c<\/h4>\n<p>\u0423 react-testing-library \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438. \u0412\u043e-\u043f\u0435\u0440\u0432\u044b\u0445, \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430. \u0412\u043e-\u0432\u0442\u043e\u0440\u044b\u0445, \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e DOM. \u042d\u0442\u043e \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0441\u0442\u0430\u0440\u0430\u0435\u0442\u0441\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u043d.\u00a0<\/p>\n<p>\u041f\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0442\u0435\u0441\u0442\u0430 \u0432\u044b\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0438\u0449\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c DOM-\u0434\u0435\u0440\u0435\u0432\u0435 \u0438 \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\u00a0<\/p>\n<p>\u0410 \u0447\u0442\u043e \u043d\u0430\u0441\u0447\u0435\u0442 \u043f\u0443\u043d\u043a\u0442\u0430 \u0441 \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430? \u0415\u0441\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438 \u0437\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c, \u0447\u0442\u043e \u0440\u0430\u0441\u0447\u0435\u0442 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u0433\u0438\u043a\u0443, \u041d\u041e \u0441 \u0434\u0430\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438 \u0432 DOM-\u0434\u0435\u0440\u0435\u0432\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e state \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f, \u043a\u0430\u043a \u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0434\u0440\u0443\u0433\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0430 \u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0435 \u2014 \u0442\u043e, \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u2014 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430\u0448\u0438\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f\u043c. \u0412\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439.<\/p>\n<p>\u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u0438\u0441\u0441\u0438\u044f \u0440\u0430\u0432\u043d\u0430 1% \u043e\u0442 \u0441\u0443\u043c\u043c\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430:<\/p>\n<pre><code class=\"javascript\">import { render, screen } from '@testing-library\/react'; import Send from '.\/index';   test('Fee element: value was changed after change of amount value', () => {   render(&lt;Send \/>)   userEvent.type(screen.getByLabelText&lt;HTMLInputElement>('Amount'), '1')   expect(screen.getByLabelText&lt;HTMLInputElement>('Fee').value).toBe('0.01'); }) <\/code><\/pre>\n<p><em>\u041b\u0438\u0442\u0435\u0440\u0430\u0442\u0443\u0440\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430: \u00ab\u043f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u0432\u0435\u043b \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u201c1\u201d \u0432 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0441 \u043b\u0435\u0439\u0431\u043b\u043e\u043c \u201cAmount\u201d, \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0441 \u043b\u0435\u0439\u0431\u043b\u043e\u043c \u201cFee\u201d \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u043e 0.01\u00bb.\u00a0<\/em><\/p>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u0432\u0430\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 React Testing Library \u2014 <strong>userEvent<\/strong>. \u041e\u043d \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 DOM, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u044b \u043a \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u00a0\u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u043d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c:<\/p>\n<p><code>userEvent.type(&lt;\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u044e\u0437\u0435\u0440>, \u00ab\u0442\u0435\u043a\u0441\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043d \u0432\u0432\u043e\u0434\u0438\u0442\u00bb)<\/code>\u00a0<\/p>\n<p>\u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443:<\/p>\n<p><code>userEvent.click(&lt;\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u044e\u0437\u0435\u0440>)<\/code><\/p>\n<p>\u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p><em>\u0414\u043b\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0442\u044c \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0443\u043c\u0430\u0435\u0442 \u043e \u043b\u043e\u0433\u0438\u043a\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u0438 \u0441\u0442\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u043c \u044e\u0437\u0435\u0440\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u0430\u043a-\u0442\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0435, \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/em><\/p>\n<h4>\u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430<\/h4>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0430, \u0443\u0433\u043b\u0443\u0431\u0438\u043c\u0441\u044f \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0438 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438.\u00a0<\/p>\n<p>\u041f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u043e DOM-\u0434\u0435\u0440\u0435\u0432\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 screen, \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043d\u0430 \u0442\u0440\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438:\u00a0<\/p>\n<p>1. getBy \u2014 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435;<\/p>\n<p>2. queryBy \u2014 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435;<\/p>\n<p>3. findBy \u2014 \u043f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 getBy \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e, \u0442\u043e \u0434\u0432\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 queryBy. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0435\u0441\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0434\u0435\u043d\u0435\u0433. \u0415\u0441\u043b\u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u043d\u0435 \u043f\u0440\u043e\u0448\u043b\u0430, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0448\u0438\u0431\u043a\u0430:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<pre><code class=\"javascript\">{error.status &amp;&amp; (   &lt;div className=\"error\">     {error.message}   &lt;\/div> )} <\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0448\u0435\u043b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u043d\u0430\u0448\u0438\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c, \u043e\u043d \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0438\u0434\u0435\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443. \u0427\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c queryBy:<\/p>\n<pre><code class=\"javascript\">test('Error element: not to be in the component by default', async ()=> {   render(&lt;Send \/>)   expect(screen.queryByText('Error')).not.toBeInTheDocument(); }) <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0434\u043b\u044f \u043b\u044e\u0431\u043e\u0433\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 <code>expect<\/code> \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>NotToBeInTheDocument<\/code>). \u0412\u0441\u0435 \u043e\u0442\u0440\u0438\u0446\u0430\u043d\u0438\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <code>.not<\/code> \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c. \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u0438\u0441\u043a, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f getBy, \u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0435 \u0442\u0435\u0441\u0442\u0430 \u2014 \u043e\u043d \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.<\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u2014 findBy \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0438\u043c\u0435\u043d\u0438 \u044e\u0437\u0435\u0440\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e:<\/p>\n<pre><code class=\"javascript\">const getUser = () => Promise.resolve({ id: '1', name: 'John Doe' })<\/code><\/pre>\n<p>\u0410 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043e \u044e\u0437\u0435\u0440\u0435:<\/p>\n<pre><code>{user &amp;&amp; &lt;div>Hello {user.name}&lt;\/div>}<\/code><\/pre>\n<p>\u0417\u043d\u0430\u0447\u0438\u0442, \u0442\u0443\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c findBy:<\/p>\n<pre><code class=\"javascript\">test('User element: exist after fetch data', async function () {  \u00a0\u00a0render(&lt;Send \/>)  \u00a0\u00a0expect(await screen.findByText(\/Hello\/)).toBeInTheDocument()  });<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0442\u043e \u0438 callback-\u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u0430\u044f \u0432 \u0442\u0435\u0441\u0442, \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e\u0439.<\/p>\n<p>\u0412\u043e\u0442 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p>getBy<\/p>\n<\/td>\n<td>\n<p>queryBy<\/p>\n<\/td>\n<td>\n<p>findBy<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByText<\/p>\n<\/td>\n<td>\n<p>queryByText<\/p>\n<\/td>\n<td>\n<p>findByText<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByRole<\/p>\n<\/td>\n<td>\n<p>queryByRole<\/p>\n<\/td>\n<td>\n<p>findByRole<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByLabelText<\/p>\n<\/td>\n<td>\n<p>queryByLabelText<\/p>\n<\/td>\n<td>\n<p>findByLabelText<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByPlaceholderText<\/p>\n<\/td>\n<td>\n<p>queryByPlaceholderText<\/p>\n<\/td>\n<td>\n<p>findByPlaceholderText<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByAltText<\/p>\n<\/td>\n<td>\n<p>queryByAltText<\/p>\n<\/td>\n<td>\n<p>findByAltText<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByDisplayValue<\/p>\n<\/td>\n<td>\n<p>queryByDisplayValue<\/p>\n<\/td>\n<td>\n<p>findByDisplayValue<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByTestId<\/p>\n<\/td>\n<td>\n<p>queryByTestId<\/p>\n<\/td>\n<td>\n<p>findByTestId<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p>getByTitle<\/p>\n<\/td>\n<td>\n<p>queryByTitle<\/p>\n<\/td>\n<td>\n<p>findByTitle<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0434\u0432\u0443\u0445:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0440\u043e\u043b\u0438 (getByRole, queryByRole, findByRole). \u041f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u043e \u0435\u0433\u043e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0440\u043e\u043b\u0438 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435. \u0412\u043e\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u043e\u043b\u0438:<\/p>\n<\/li>\n<\/ol>\n<p>\u2018combobox\u2019 &#8212; \u0442\u0435\u0433 <code>&lt;select \/><\/code><\/p>\n<p>\u2018button\u2019 &#8212; \u0442\u0435\u0433 <code>&lt;button \/><\/code> \u0438\u043b\u0438 <code>&lt;input type=\u00absubmit\u00bb \/><\/code><\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f getByRole:<\/p>\n<pre><code>userEvent.click(screen.getByRole('button'));\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><\/pre>\n<ol start=\"2\">\n<li>\n<p>\u041f\u043e\u0438\u0441\u043a \u043f\u043e testId. \u0412 \u043a\u043e\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043b\u044e\u0431\u043e\u043c\u0443 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0443 data-\u0430\u0442\u0440\u0438\u0431\u0443\u0442 testId \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u0438\u0441\u043a\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430:<\/p>\n<\/li>\n<\/ol>\n<pre><code>&lt;div data-testid=\"custom-element\" \/><\/code><\/pre>\n<p>\u0423 \u0432\u0441\u0435\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043f\u043e\u0438\u0441\u043a\u0430 \u0435\u0441\u0442\u044c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u043f\u043e\u0438\u0441\u043a\u0430 \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0443\u0441\u043b\u043e\u0432\u0438\u044e \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435:<\/p>\n<ul>\n<li>\n<p>get<strong>All<\/strong>ByText<\/p>\n<\/li>\n<li>\n<p>query<strong>All<\/strong>ByPlaceholderText<\/p>\n<\/li>\n<li>\n<p>find<strong>All<\/strong>ByTestId<\/p>\n<\/li>\n<li>\n<p>\u0438 \u0442.\u0434. \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432<\/p>\n<\/li>\n<\/ul>\n<h4>\u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/h4>\n<p>\u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439. \u041e\u043d\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430:<\/p>\n<pre><code>expect(&lt;\u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435>).toBe(&lt;\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435>);<\/code><\/pre>\n<p>\u041f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0430\u0440\u0443 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 expect:<\/p>\n<ul>\n<li>\n<p><strong>toBeNull:<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><code>expect(screen.queryByText(\/Hello\/)).toBeNull();<\/code><\/p>\n<p><em>\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d null<\/em><\/p>\n<ul>\n<li>\n<p><strong>toBeInTheDocument:<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><code>expect(await screen.findByText(\/Hello\/)).toBeInTheDocument()<\/code><\/p>\n<p><em>\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0435\u0441\u0442\u044c \u0432 DOM<\/em><\/p>\n<ul>\n<li>\n<p><strong>toBeTruthy:<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><code>expect(screen.getByLabelText&lt;HTMLInputElement>('Fee').disabled).toBeTruthy();<\/code><\/p>\n<p><em>\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u0441 \u043b\u0435\u0439\u0431\u043b\u043e\u043c &#171;Fee&#187; \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0432\u0432\u043e\u0434\u0430<\/em><\/p>\n<ul>\n<li>\n<p><strong>toHaveTextContent:<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><code>expect(screen.getByText&lt;HTMLSpanElement>(\/balance\/i)).toHaveTextContent('10');<\/code><\/p>\n<p><em>\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u043a\u0441\u0442 &#171;balance&#187;, \u0431\u0443\u0434\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 &#8217;10&#8217;\u00a0<\/em><\/p>\n<ul>\n<li>\n<p><strong>toBe:<\/strong><\/p>\n<\/li>\n<\/ul>\n<p><code>expect(state[0].balance).toBe(4.95);<\/code><\/p>\n<p><em>\u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u043e\u0434\u043d\u0430 \u0446\u0438\u0444\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0446\u0438\u0444\u0440\u0435 (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0430\u043b\u0430\u043d\u0441 \u043a\u043e\u0448\u0435\u043b\u044c\u043a\u0430 \u0438\u0437 state \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d 4.95)<\/em><\/p>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 Jest, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0441 \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043d\u0430 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 <a href=\"https:\/\/jestjs.io\/docs\/expect\"><u>jest<\/u><\/a>.<\/p>\n<p>\u0412 \u0447\u0435\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u043e\u0434 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439, \u0445\u043e\u0442\u044f \u0432\u0441\u0435\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c <code>.toBe()<\/code> \u0438 \u043d\u0435 \u0437\u0430\u043c\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f?\u00a0<\/p>\n<p>\u0418\u0445 \u0434\u0432\u0430: \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043a\u043e\u0434 \u0443\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u0438\u043c \u0447\u043b\u0435\u043d\u043e\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u0434\u0430\u0436\u0435 \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u0441 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430 \u0438 \u0442\u0435\u0441\u0442\u043e\u0432, \u0438 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0432 \u043b\u043e\u0433\u0430\u0445, \u0435\u0441\u043b\u0438 \u0442\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u0441\u044f.<\/p>\n<h4>userEvent \u0438 fireEvent<\/h4>\n<p>\u041a\u0430\u043a \u044f \u0443\u0436\u0435 \u0433\u043e\u0432\u043e\u0440\u0438\u043b, <a href=\"https:\/\/github.com\/testing-library\/user-event\"><u>userEvent<\/u><\/a> \u0438\u043c\u0438\u0442\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 <\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-329426","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/329426","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=329426"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/329426\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=329426"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=329426"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=329426"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}