{"id":73387,"date":"2024-08-14T07:21:08","date_gmt":"2024-08-14T03:51:08","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/efficient-ui-validation-exploring-widget-testing-in-flutter-ui-tests-31d4\/"},"modified":"2024-08-14T07:21:08","modified_gmt":"2024-08-14T03:51:08","slug":"efficient-ui-validation-exploring-widget-testing-in-flutter-ui-tests-31d4","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/efficient-ui-validation-exploring-widget-testing-in-flutter-ui-tests-31d4\/","title":{"rendered":"\u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0631\u0627\u0628\u0637 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06a9\u0627\u0631\u0622\u0645\u062f: \u0628\u0631\u0631\u0633\u06cc \u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u062f\u0631 Flutter (\u062a\u0633\u062a\u200c\u0647\u0627\u06cc UI)"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang <\/p>\n<p>  \u06a9\u0645\u06cc \u0632\u0645\u06cc\u0646\u0647<\/p>\n<p>\u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u0646\u0648\u0639\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0627\u0633\u062a \u06a9\u0647 \u06af\u0627\u0647\u06cc \u062f\u0633\u062a \u06a9\u0645 \u06af\u0631\u0641\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f\u060c \u0627\u0645\u0627 \u0627\u0631\u0632\u0634 \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u062f\u0627\u0631\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0646\u06a9\u0627\u062a\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631 \u062c\u0631\u06cc\u0627\u0646 \u06a9\u0627\u0631 \u0631\u0648\u0632\u0627\u0646\u0647 \u062e\u0648\u062f \u0628\u06af\u0646\u062c\u0627\u0646\u06cc\u062f\u060c \u0648 \u06a9\u0627\u0631\u0628\u0631\u062f\u0647\u0627\u06cc \u0639\u0645\u0644\u06cc \u0622\u0646 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u06cc\u0645.<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u063a\u0648\u0627\u0635\u06cc\u060c \u0630\u06a9\u0631 \u0627\u06cc\u0646 \u0646\u06a9\u062a\u0647 \u0636\u0631\u0648\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0631\u0633\u0645\u06cc \u0641\u0644\u0627\u062a\u0631 \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u0634\u0631\u0648\u0639 \u0639\u0627\u0644\u06cc \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0646\u0645\u0648\u0646\u0647\u200c\u0647\u0627\u06cc \u0633\u0627\u062f\u0647 \u0648 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u062f\u0631\u06a9 \u06a9\u0627\u0645\u0644\u06cc \u0627\u0632 \u0646\u062d\u0648\u0647 \u06a9\u0627\u0631 \u06a9\u0631\u062f\u0646 \u0686\u06cc\u0632\u0647\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c \u062e\u0644\u0627\u0635\u0647\u200c\u0627\u06cc \u0627\u0632 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0644\u06cc\u062f\u06cc \u0631\u0627 \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u0628\u06cc\u0646\u0634\u200c\u0647\u0627\u06cc \u0634\u062e\u0635\u06cc \u06a9\u0647 \u0632\u0645\u0627\u0646 \u0632\u06cc\u0627\u062f\u06cc \u0631\u0627 \u0635\u0631\u0641 \u06a9\u0627\u0631 \u0628\u0627 \u0627\u06cc\u0646 \u0646\u0648\u0639 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a\u060c \u062e\u0648\u0627\u0647\u06cc\u062f \u06cc\u0627\u0641\u062a.<\/p>\n<p>  \u0686\u0647 \u0645\u0634\u06a9\u0644\u06cc \u0631\u0627 \u062d\u0644 \u0645\u06cc \u06a9\u0646\u062f\u061f<\/p>\n<p>\u0628\u0631\u0627\u06cc \u062f\u0631\u06a9 \u0646\u0642\u0634 \u0648 \u0627\u0646\u0648\u0627\u0639 \u062a\u0633\u062a \u0647\u0627\u06cc \u0648\u06cc\u062c\u062a\u060c \u0627\u06cc\u0646 \u0648\u06cc\u062f\u06cc\u0648 \u0631\u0627 \u062f\u0631 \u06a9\u0627\u0646\u0627\u0644 \u06cc\u0648\u062a\u06cc\u0648\u0628 Flutter \u062a\u0645\u0627\u0634\u0627 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0633\u0647 \u0646\u0648\u0639 \u062a\u0633\u062a UI \u0631\u0627 \u062a\u0648\u0636\u06cc\u062d \u0645\u06cc \u062f\u0647\u062f:<\/p>\n<p>\u062a\u0633\u062a \u0647\u0627\u06cc \u0637\u0644\u0627\u06cc\u06cc (\u0645\u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u067e\u06cc\u06a9\u0633\u0644 \u06a9\u0627\u0645\u0644)\u061b<br \/>\n\u062a\u0633\u062a \u0647\u0627\u06cc \u06cc\u0627\u0628 (Comportamento);<br \/>\n\u062a\u0633\u062a \u0647\u0627\u06cc PaitPattern (\u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc \u062a\u0631\u0633\u06cc\u0645)\u061b<\/p>\n<p>\u0645\u0627 \u0631\u0648\u06cc \u0646\u0648\u0639 \u062f\u0648\u0645 \u062a\u0645\u0631\u06a9\u0632 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f\u060c Finder tests\u060c \u06a9\u0647 \u0631\u0641\u062a\u0627\u0631 \u0627\u062c\u0632\u0627\u06cc \u0634\u0645\u0627 \u0631\u0627 \u062a\u0627\u06cc\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0627\u0633\u0646\u0627\u062f Flutter \u0622\u0645\u062f\u0647 \u0627\u0633\u062a: &#8220;\u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0648\u06cc\u062c\u062a \u0647\u0627 \u0646\u0647 \u062a\u0646\u0647\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0627 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc \u062f\u0647\u0646\u062f\u060c \u0628\u0644\u06a9\u0647 \u0628\u0647 \u062a\u0639\u0627\u0645\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0646\u06cc\u0632 \u067e\u0627\u0633\u062e \u0645\u06cc \u062f\u0647\u0646\u062f. \u0627\u06cc\u0646 \u0634\u0627\u0645\u0644 \u062f\u06a9\u0645\u0647 \u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0631\u0648\u06cc \u0622\u0646\u0647\u0627 \u0636\u0631\u0628\u0647 \u0632\u062f \u0648 TextFields \u0628\u0631\u0627\u06cc \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0645\u062a\u0646.&#8221;<\/p>\n<p>  \u0645\u0641\u0627\u0647\u06cc\u0645 \u0627\u0633\u0627\u0633\u06cc<\/p>\n<p>\u0627\u06cc\u062c\u0627\u062f \u0627\u06cc\u0646 \u0646\u0648\u0639 \u062a\u0633\u062a \u0628\u0633\u06cc\u0627\u0631 \u0634\u0628\u06cc\u0647 \u0628\u0647 \u062a\u0633\u062a \u0648\u0627\u062d\u062f \u0627\u0633\u062a. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0628\u0627\u06cc\u062f SDK \u062a\u0633\u062a \u0627\u0628\u0632\u0627\u0631\u06a9 Flutter \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>dev_dependencies:<br \/>\n  flutter_test:<br \/>\n    sdk: flutter<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u0628\u0647 \u0631\u0648\u0634 \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0648 \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a \u0647\u0627\u06cc \u062e\u0648\u062f \u062f\u0633\u062a\u0631\u0633\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u062f\u0627\u0634\u062a.<\/p>\n<p>\u06cc\u06a9 \u0631\u0627\u0647 \u0633\u0631\u06cc\u0639 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062f\u0631 VSCode \u0628\u0627 \u06a9\u0644\u06cc\u06a9 \u0631\u0627\u0633\u062a \u0648 \u0627\u0646\u062a\u062e\u0627\u0628 \u06af\u0632\u06cc\u0646\u0647 Go to Test \u0627\u0633\u062a. \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0622\u06cc\u0627 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0627\u0632 \u0642\u0628\u0644 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06cc\u0627 \u062e\u06cc\u0631. \u0627\u06af\u0631 \u0646\u0647\u060c \u067e\u06cc\u0634\u0646\u0647\u0627\u062f \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9\u06cc \u0631\u0627 \u0645\u06cc \u062f\u0647\u062f. \u0627\u06cc\u0646 \u06cc\u06a9 \u062f\u0633\u062a\u0648\u0631 \u0633\u0627\u062f\u0647 \u0627\u0645\u0627 \u0645\u0641\u06cc\u062f \u0627\u0633\u062a\u060c \u0628\u0647 \u062e\u0635\u0648\u0635 \u06a9\u0647 \u062a\u0645\u0627\u0645 \u0644\u0627\u06cc\u0647 \u0647\u0627\u06cc \u067e\u0648\u0634\u0647 \u0644\u0627\u0632\u0645 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0646 \u0641\u0627\u06cc\u0644 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0633\u06cc\u0627\u0631 \u062a\u0645\u06cc\u0632 &#8211; \u0622\u0646 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u062f!<\/p>\n<p>\u062f\u0631 \u062f\u0627\u062e\u0644 \u0641\u0627\u06cc\u0644 \u062a\u0633\u062a \u062e\u0648\u062f\u060c \u0628\u0627\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f:<\/p>\n<p>testWidgets(&#8216;Test Description&#8217;, (WidgetTester tester) async {})<\/p>\n<p>testWidgets  \u0631\u0648\u0634\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a \u0647\u0627\u06cc \u0648\u06cc\u062c\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f \u0648 tester \u0627\u0628\u0632\u0627\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0627\u06cc \u06cc\u0627\u0641\u062a\u0646\u060c \u062a\u0639\u0627\u0645\u0644 \u0648 \u0645\u0648\u0627\u0631\u062f \u062f\u06cc\u06af\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646\u060c \u0628\u0627\u06cc\u062f \u0648\u06cc\u062c\u062a \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f. \u0631\u0627\u06cc\u062c \u062a\u0631\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0628\u0647 \u0634\u0631\u062d \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n<p>await tester.pumpWidget(const MyWidget());<\/p>\n<p>\u0627\u06cc\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06a9\u0627\u0646 \u062e\u0648\u0628\u06cc \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0628\u0631\u062e\u06cc \u0627\u0632 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0627\u0648\u0644\u06cc\u0647 \u0628\u0631\u0627\u06cc \u0645\u0624\u0644\u0641\u0647 \u062e\u0648\u062f \u0627\u0633\u062a\u060c \u0645\u0627\u0646\u0646\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062a\u0645 \u06cc\u0627 \u062d\u062a\u06cc \u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc. \u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u062c\u0632\u0621 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u067e\u06cc\u0686\u06cc\u062f MaterialApp \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u062f\u0627\u0634\u062a\u0646 \u062a\u0645\u0627\u0645 \u062a\u0645 \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0648 MediaQuery \u062a\u0646\u0638\u06cc\u0645\u0627\u062a<\/p>\n<p>await tester.pumpWidget(MaterialApp(home: const MyWidget()));<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0645\u06a9\u0627\u0646 \u06cc\u0627\u0628\u06cc \u0639\u0646\u0627\u0635\u0631 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 CommonFinders singleton \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0631\u0627\u0647\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u06cc\u0627\u0641\u062a\u0646 \u0639\u0646\u0635\u0631 \u0645\u0648\u0631\u062f \u0646\u0638\u0631 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u0648 \u0639\u0644\u0627\u0645\u062a \u06af\u0630\u0627\u0631\u06cc \u06a9\u0627\u0645\u0644\u0627\u064b \u0633\u0627\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<p>final buttonFinder = find.byType(ElevatedButton)<br \/>\nfinal textFinder = find.text(&#8216;Hello world!&#8217;)<br \/>\nfinal myWidgetByKeyFinder = find.byKey(Key(&#8216;MyWidget-Key&#8217;))<\/p>\n<p>\u0645\u0647\u0645 \u0627\u0633\u062a \u06a9\u0647 \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647\u060c \u0645\u0627\u0646\u0646\u062f buttonFinder \u0648 textFinder\u060c \u0639\u0646\u0627\u0635\u0631 \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0646\u0645\u06cc \u06a9\u0646\u0646\u062f\u060c \u0628\u0644\u06a9\u0647 \u06cc\u06a9 &#8220;\u0631\u0627\u0647\u06cc&#8221; \u0628\u0631\u0627\u06cc \u06cc\u0627\u0641\u062a\u0646 \u0622\u0646\u0647\u0627 \u0647\u0633\u062a\u0646\u062f.<\/p>\n<p>expect(buttonFinder, findsOneWidget);<\/p>\n<p>\u062f\u0631 \u062a\u0633\u062a \u0628\u0627\u0644\u0627\u060c \u0645\u0646 \u062f\u0642\u06cc\u0642\u0627 \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u06cc\u06a9 \u062f\u06a9\u0645\u0647 \u0647\u0633\u062a\u0645. \u0627\u06af\u0631 \u0647\u06cc\u0686 \u06cc\u0627 \u0628\u06cc\u0634 \u0627\u0632 \u06cc\u06a9 \u0645\u0648\u0631\u062f \u067e\u06cc\u062f\u0627 \u0646\u0634\u062f\u060c \u0622\u0632\u0645\u0648\u0646 \u0646\u0627\u0645\u0648\u0641\u0642 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u0639\u0646\u0627\u0635\u0631\u060c \u0627\u0632 tester \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 testWidgets \u0631\u0648\u0634 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0642\u062f\u0627\u0645\u0627\u062a\u06cc \u0645\u0627\u0646\u0646\u062f \u0636\u0631\u0628\u0647 \u0632\u062f\u0646\u060c \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0645\u062a\u0646 \u06cc\u0627 \u06a9\u0634\u06cc\u062f\u0646 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f. \u0634\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062e\u0648\u062f \u0639\u0646\u0635\u0631 \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>await tester.enterText(find.byType(TextField), &#8216;hi&#8217;);<\/p>\n<p>await tester.pump()<\/p>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u062f\u0631\u062e\u062a \u0648\u06cc\u062c\u062a \u067e\u0633 \u0627\u0632 \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u062a\u0639\u0627\u0645\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627\u0632\u0633\u0627\u0632\u06cc \u0645\u06cc \u0634\u0648\u062f\u060c \u067e\u0645\u067e() \u06cc\u0627 pumpAndSettle() \u0631\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u062e\u0644\u0627\u0635\u0647 \u0627\u06cc \u0627\u0632 \u0646\u062d\u0648\u0647 \u06a9\u0627\u0631 \u0622\u0646\u0647\u0627 \u0622\u0648\u0631\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<p>  \u0628\u06cc\u0627\u06cc\u06cc\u062f \u062a\u0645\u0631\u06cc\u0646 \u06a9\u0646\u06cc\u0645!<\/p>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u062c\u0632\u0621 \u0645\u062b\u0627\u0644 \u0645\u0627 \u0627\u0633\u062a:<\/p>\n<p>class PrimaryButton extends StatelessWidget {<br \/>\n  PrimaryButton({<br \/>\n    required String title,<br \/>\n    super.key,<br \/>\n    this.onTap,<br \/>\n    this.backgroundColor = Colors.blue,<br \/>\n    this.isLoading = false,<br \/>\n  }) : title = Text(<br \/>\n          title,<br \/>\n        );<\/p>\n<p>  final Widget title;<br \/>\n  final VoidCallback? onTap;<br \/>\n  final Color backgroundColor;<br \/>\n  final bool isLoading;<\/p>\n<p>  @override<br \/>\n  Widget build(BuildContext context) =&gt; ElevatedButton(<br \/>\n        style: ButtonStyle(<br \/>\n          backgroundColor: MaterialStateProperty.resolveWith&lt;Color&gt;(<br \/>\n            (Set&lt;MaterialState&gt; states) {<br \/>\n              if (isLoading) {<br \/>\n                return Colors.grey;<br \/>\n              }<\/p>\n<p>              return backgroundColor;<br \/>\n            },<br \/>\n          ),<br \/>\n        ),<br \/>\n        onPressed: isLoading ? null : onTap,<br \/>\n        child: isLoading ? const CircularProgressIndicator() : title,<br \/>\n      );<br \/>\n}<\/p>\n<p>\u0631\u0641\u062a\u0627\u0631\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0644\u0627\u0641\u0627\u0635\u0644\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u0628\u0631\u062c\u0633\u062a\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632:<\/p>\n<p>\u062a\u063a\u06cc\u06cc\u0631 \u0631\u0646\u06af \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647\u061b<br \/>\n\u0648\u0642\u062a\u06cc isLoading \u062f\u0631\u0633\u062a \u0627\u0633\u062a:<\/p>\n<p>onTap \u0646\u0628\u0627\u06cc\u062f \u0642\u0627\u0628\u0644 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0628\u0627\u0634\u062f.<br \/>\n\u06cc\u06a9 CircularProgressIndicator \u0628\u0627\u06cc\u062f \u0628\u0647 \u062c\u0627\u06cc \u0639\u0646\u0648\u0627\u0646 \u0645\u0627 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0634\u0648\u062f.<br \/>\nbackgroundColor \u0628\u0627\u06cc\u062f Colors.grey \u0628\u0627\u0634\u062f.<\/p>\n<p>\u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc backgroundColor \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0645\u0624\u0644\u0641\u0647 \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0622\u0645\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645:<\/p>\n<p>testWidgets(&#8216;Slould be able to render and interact with PrimaryButton&#8217;,<br \/>\n    (tester) async {<br \/>\n  await tester.pumpWidget(MaterialApp(<br \/>\n    home: PrimaryButton(<br \/>\n      title: &#8216;title&#8217;,<br \/>\n      backgroundColor: Colors.red,<br \/>\n      onTap: () {},<br \/>\n    ),<br \/>\n  ));<\/p>\n<p>  \/\/ &#8230;<br \/>\n});<\/p>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0622\u06cc\u0627 \u0631\u0646\u06af \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u0627\u0639\u0645\u0627\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631.<\/p>\n<p>\u0645\u0647\u0645 \u0627\u0633\u062a<\/p>\n<p>\u062f\u06a9\u0645\u0647 \u0631\u0646\u062f\u0631 \u0634\u062f\u0647 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0627\u06cc\u0646 \u0646\u06cc\u0633\u062a PrimaryButton \u0627\u0645\u0627 \u06cc\u06a9 ElevatedButton\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0647\u0627 \u0648 \u062a\u0639\u0627\u0645\u0644\u0627\u062a \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0627\u06cc\u0646 \u0645\u0624\u0644\u0641\u0647 \u0627\u0646\u062c\u0627\u0645 \u0634\u0648\u062f\u060c \u0646\u0647 \u0648\u0627\u0644\u062f \u0622\u0646. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c onTap \u0631\u0648\u0634 \u062f\u0631 PrimaryButton; \u0627\u06af\u0631 \u0633\u0639\u06cc \u06a9\u0646\u06cc\u062f \u0628\u0647 \u0622\u0646 \u0636\u0631\u0628\u0647 \u0628\u0632\u0646\u06cc\u062f\u060c \u0647\u06cc\u0686 \u0627\u062a\u0641\u0627\u0642\u06cc \u0646\u0645\u06cc \u0627\u0641\u062a\u062f. \u0627\u0645\u0627 \u0628\u0627 \u0622\u0646 \u06a9\u0627\u0631 \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f ElevatedButton.<\/p>\n<p>\u0647\u0645\u06cc\u0646 \u0645\u0641\u0647\u0648\u0645 \u062f\u0631 \u0645\u0648\u0631\u062f \u06a9\u0644\u06cc\u062f\u0647\u0627 \u0646\u06cc\u0632 \u0635\u062f\u0642 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0639\u0646\u0635\u0631\u06cc \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0628\u0627\u06cc\u062f \u0628\u062f\u0627\u0646\u06cc\u062f \u06a9\u0647 \u06a9\u0644\u06cc\u062f \u0631\u0627 \u0628\u0647 \u06a9\u062f\u0627\u0645 \u0648\u06cc\u062c\u062a \u0627\u062e\u062a\u0635\u0627\u0635 \u062f\u0647\u06cc\u062f. \u062f\u0631 \u0645\u062b\u0627\u0644 \u0645\u0627\u060c \u06a9\u0644\u06cc\u062f \u0627\u0632 PrimaryButton \u0628\u0627 \u0641\u0631\u0632\u0646\u062f\u0634 \u06cc\u06a9\u06cc \u0646\u06cc\u0633\u062a ElevatedButton. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0627\u06af\u0631 \u0633\u0639\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u062f \u062a\u062d\u0631\u06cc\u06a9 \u06a9\u0646\u06cc\u062f onTap \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0648\u0627\u0644\u062f\u06cc\u0646\u060c \u06a9\u0627\u0631 \u0646\u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f. \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a Flutter \u067e\u06cc\u0634\u200c\u0641\u0631\u0636\u060c \u0628\u0627\u06cc\u062f \u0622\u0646\u0647\u0627 \u0631\u0627 \u06af\u0633\u062a\u0631\u0634 \u062f\u0647\u06cc\u062f:<\/p>\n<p>class PrimaryButton extends ElevatedButton {}<\/p>\n<p>\u0628\u0647 \u0627\u06cc\u0646 \u062a\u0631\u062a\u06cc\u0628\u060c \u0645\u0633\u0627\u0626\u0644 \u0630\u06a9\u0631 \u0634\u062f\u0647 \u062f\u0631 \u0628\u0627\u0644\u0627 \u0631\u062e \u0646\u062e\u0648\u0627\u0647\u062f \u062f\u0627\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0645\u0646 \u062a\u0631\u062c\u06cc\u062d \u062f\u0627\u062f\u0645 \u0627\u0632 \u0627\u06cc\u0646 \u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0647\u0633\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645\u060c \u0632\u06cc\u0631\u0627 \u0627\u0632 \u06af\u0633\u062a\u0631\u0634 \u0648\u06cc\u062c\u062a\u200c\u0647\u0627 \u0631\u0627\u06cc\u062c\u200c\u062a\u0631 \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u0631\u0646\u06af\u06cc \u06a9\u0647 \u0645\u0627 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0631\u062f\u06cc\u0645 \u0648\u0627\u0642\u0639\u0627\u064b \u0627\u0639\u0645\u0627\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u06cc\u0645:<\/p>\n<p>final buttonFinder = find.byType(ElevatedButton);<br \/>\nfinal buttonWidget = tester.widget&lt;ElevatedButton&gt;(buttonFinder);<\/p>\n<p>expect(<br \/>\n  buttonWidget.style?.backgroundColor?.resolve({}),<br \/>\n  Colors.red,<br \/>\n);<br \/>\nexpect(find.text(&#8216;title&#8217;), findsOneWidget);<\/p>\n<p>\u0628\u0627 \u0638\u0647\u0648\u0631 Material3 \u0648 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc MaterialStateProperty\u060c \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 resolve \u0631\u0648\u0634\u06cc \u0628\u0631\u0627\u06cc \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646 \u0648\u06cc\u0698\u06af\u06cc \u062c\u0632\u0621 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u062d\u0627\u0644\u062a \u062e\u0627\u0635. \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0647\u06cc\u0686 \u062d\u0627\u0644\u062a\u06cc \u0631\u0627 \u067e\u0627\u0633 \u0646\u06a9\u0631\u062f\u06cc\u0645\u060c \u0627\u0632 \u06cc\u06a9 \u062e\u0627\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645 Set.<\/p>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u06a9\u0627\u0645\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0628\u0639\u062f\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0622\u0646 \u062a\u0639\u0627\u0645\u0644 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645 onTap \u0631\u0648\u0634<\/p>\n<p>\u062a\u0639\u0627\u0645\u0644 \u0628\u0627 onTap \u0631\u0648\u0634<\/p>\n<p>\u06cc\u06a9 \u0631\u0627\u0647 \u0633\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u0645\u062a\u062f \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631\u060c \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u0633\u062a mockito \u06cc\u0627 mocktail.<\/p>\n<p>class OnTapMock extends Mock {<br \/>\n  void call();<br \/>\n}<\/p>\n<p>void main() {<br \/>\n  late OnTapMock onTapMock;<\/p>\n<p>  setUp(() {<br \/>\n    onTapMock = OnTapMock();<br \/>\n  });<br \/>\n}<\/p>\n<p>\u0645\u0627 \u0627\u06cc\u0646 \u0633\u0627\u062e\u062a\u06af\u06cc \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u062a\u0645\u0627\u0633 \u0628\u0631\u0627\u06cc onTap \u0631\u0648\u0634 \u0648 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc:<\/p>\n<p>verifyNever(() =&gt; onTapMock());<\/p>\n<p>\u062d\u0627\u0644 \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0648\u0627\u0642\u0639\u06cc:<\/p>\n<p>await tester.tap(buttonFinder);<\/p>\n<p>verify(() =&gt; onTapMock());<\/p>\n<p>\u0633\u0627\u062f\u0647 \u0627\u0633\u062a\u060c \u062f\u0631\u0633\u062a \u0627\u0633\u062a\u061f<\/p>\n<p>\u0647\u0646\u062f\u0644\u06cc\u0646\u06af isLoading == true<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u062a\u0633\u062a \u062c\u062f\u06cc\u062f \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645:<\/p>\n<p>testWidgets(&#8216;Slould be able to validate PrimaryButton behaivor with isLoading equals true&#8217;,<br \/>\n    (tester) async {<br \/>\n  await tester.pumpWidget(MaterialApp(<br \/>\n    home: PrimaryButton(<br \/>\n      title: &#8216;title&#8217;,<br \/>\n      backgroundColor: Colors.red,<br \/>\n      onTap: () =&gt; onTapMock(),<br \/>\n      isLoading: true,<br \/>\n    ),<br \/>\n  ));<br \/>\n});<\/p>\n<p>\u0648 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0647\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:<\/p>\n<p>final buttonFinder = find.byType(ElevatedButton);<br \/>\nfinal buttonWidget = tester.widget&lt;ElevatedButton&gt;(buttonFinder);<\/p>\n<p>expect(<br \/>\n  buttonWidget.style?.backgroundColor?.resolve({}),<br \/>\n  Colors.grey,<br \/>\n);<br \/>\nexpect(find.text(&#8216;title&#8217;), findsNothing);<br \/>\nexpect(find.byType(CircularProgressIndicator), findsOneWidget);<br \/>\nverifyNever(() =&gt; onTapMock());<\/p>\n<p>await tester.tap(buttonFinder);<\/p>\n<p>verifyNever(() =&gt; onTapMock());<\/p>\n<p>\u0628\u0647 \u0627\u06cc\u0646 \u062a\u0631\u062a\u06cc\u0628\u060c \u0645\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0627 isLoading == true \u062a\u06a9\u06cc\u0647 \u06af\u0627\u0647:<\/p>\n<p>\u0631\u0646\u06af \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a.<br \/>\n\u0639\u0646\u0648\u0627\u0646 \u0627\u0631\u0627\u0626\u0647 \u0646\u0634\u062f\u0647 \u0627\u0633\u062a.<br \/>\n\u0631\u0627 CircularProgressIndicator \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f\u061b<br \/>\n\u0636\u0631\u0628\u0647 \u0632\u062f\u0646 \u0631\u0648\u06cc \u062f\u06a9\u0645\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a\u060c \u067e\u0627\u0633\u062e \u062a\u0645\u0627\u0633 \u0631\u0627 \u0622\u063a\u0627\u0632 \u0646\u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062e\u0627\u0637\u0631 \u0627\u06cc\u0646 \u0645\u0624\u0644\u0641\u0647 \u0631\u0627 \u0627\u0635\u0644\u0627\u062d \u06a9\u0646\u06cc\u0645\u060c \u0632\u06cc\u0631\u0627 \u0645\u06cc\u200c\u062f\u0627\u0646\u06cc\u0645 \u06a9\u0647 \u0631\u0641\u062a\u0627\u0631 \u0622\u0646 \u062b\u0627\u0628\u062a \u0627\u0633\u062a.<\/p>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/p>\n<p>\u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u062f\u0631 Flutter \u06cc\u06a9 \u0641\u0631\u0622\u06cc\u0646\u062f \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0648 \u0644\u0630\u062a \u0628\u062e\u0634 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0631\u0641\u062a\u0627\u0631 \u0627\u062c\u0632\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0648\u062b\u0631 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f. \u06af\u0627\u0647\u06cc \u0627\u0648\u0642\u0627\u062a\u060c \u0627\u06cc\u0646 \u0622\u0632\u0645\u0627\u06cc\u0634\u200c\u0647\u0627 \u0627\u0632 \u0634\u0645\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u0646\u062f \u06a9\u0647 \u062f\u0631 \u0645\u0648\u0631\u062f \u0633\u0627\u062e\u062a\u0627\u0631 \u0627\u062c\u0632\u0627\u06cc \u062e\u0648\u062f \u062a\u062c\u062f\u06cc\u062f \u0646\u0638\u0631 \u06a9\u0646\u06cc\u062f\u060c \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0634\u0628\u06cc\u0647 \u0622\u0646\u0686\u0647 \u062f\u0631 \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u0648\u0627\u062d\u062f \u0627\u062a\u0641\u0627\u0642 \u0645\u06cc\u200c\u0627\u0641\u062a\u062f\u060c \u0627\u0633\u062a\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647\u0628\u0648\u062f \u0631\u0648\u0634\u06cc \u06a9\u0647 \u0631\u0648\u0634\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0627\u0628\u0633\u062a\u06af\u06cc\u200c\u0647\u0627 \u0645\u0646\u062c\u0631 \u0628\u0647 \u06a9\u062f \u0642\u0648\u06cc\u200c\u062a\u0631 \u0648 \u0642\u0627\u0628\u0644 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u06cc\u200c\u0634\u0648\u062f.<\/p>\n<p>\u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u062a\u0633\u062a\u200c\u0647\u0627 \u0647\u0646\u06af\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u062f\u0631 \u06a9\u062f\u060c \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0628\u06cc\u0634\u062a\u0631\u06cc \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u0645\u06cc\u200c\u0622\u0648\u0631\u062f \u0648 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u0631\u0641\u062a\u0627\u0631 \u0645\u0648\u0631\u062f \u0646\u0638\u0631 \u062f\u0633\u062a \u0646\u062e\u0648\u0631\u062f\u0647 \u0628\u0627\u0642\u06cc \u0645\u06cc\u200c\u0645\u0627\u0646\u062f. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0627\u06af\u0631 \u0647\u0646\u0648\u0632 \u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u0631\u0627 \u062f\u0631 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u062e\u0648\u062f \u0627\u062f\u063a\u0627\u0645 \u0646\u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f\u060c \u0627\u06a9\u0646\u0648\u0646 \u0632\u0645\u0627\u0646 \u0645\u0646\u0627\u0633\u0628\u06cc \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u06cc\u0646 \u0647\u0645\u0647 \u0628\u0631\u0627\u06cc \u0627\u0645\u0631\u0648\u0632 \u0627\u0633\u062a! \u062f\u0641\u0639\u0647 \u0628\u0639\u062f \u0645\u06cc \u0628\u06cc\u0646\u0645\u062a!<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/nabfollower.com\/blog\/efficient-ui-validation-exploring-widget-testing-in-flutter-ui-tests-31d4\/#%DA%A9%D9%85%DB%8C_%D8%B2%D9%85%DB%8C%D9%86%D9%87\" >\u06a9\u0645\u06cc \u0632\u0645\u06cc\u0646\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/efficient-ui-validation-exploring-widget-testing-in-flutter-ui-tests-31d4\/#%DA%86%D9%87_%D9%85%D8%B4%DA%A9%D9%84%DB%8C_%D8%B1%D8%A7_%D8%AD%D9%84_%D9%85%DB%8C_%DA%A9%D9%86%D8%AF%D8%9F\" >\u0686\u0647 \u0645\u0634\u06a9\u0644\u06cc \u0631\u0627 \u062d\u0644 \u0645\u06cc \u06a9\u0646\u062f\u061f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/efficient-ui-validation-exploring-widget-testing-in-flutter-ui-tests-31d4\/#%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85_%D8%A7%D8%B3%D8%A7%D8%B3%DB%8C\" >\u0645\u0641\u0627\u0647\u06cc\u0645 \u0627\u0633\u0627\u0633\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/efficient-ui-validation-exploring-widget-testing-in-flutter-ui-tests-31d4\/#%D8%A8%DB%8C%D8%A7%DB%8C%DB%8C%D8%AF_%D8%AA%D9%85%D8%B1%DB%8C%D9%86_%DA%A9%D9%86%DB%8C%D9%85\" >\u0628\u06cc\u0627\u06cc\u06cc\u062f \u062a\u0645\u0631\u06cc\u0646 \u06a9\u0646\u06cc\u0645!<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/efficient-ui-validation-exploring-widget-testing-in-flutter-ui-tests-31d4\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%DA%A9%D9%85%DB%8C_%D8%B2%D9%85%DB%8C%D9%86%D9%87\"><\/span>\n<p>  \u06a9\u0645\u06cc \u0632\u0645\u06cc\u0646\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u0646\u0648\u0639\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0627\u0633\u062a \u06a9\u0647 \u06af\u0627\u0647\u06cc \u062f\u0633\u062a \u06a9\u0645 \u06af\u0631\u0641\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f\u060c \u0627\u0645\u0627 \u0627\u0631\u0632\u0634 \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u062f\u0627\u0631\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0646\u06a9\u0627\u062a\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631 \u062c\u0631\u06cc\u0627\u0646 \u06a9\u0627\u0631 \u0631\u0648\u0632\u0627\u0646\u0647 \u062e\u0648\u062f \u0628\u06af\u0646\u062c\u0627\u0646\u06cc\u062f\u060c \u0648 \u06a9\u0627\u0631\u0628\u0631\u062f\u0647\u0627\u06cc \u0639\u0645\u0644\u06cc \u0622\u0646 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u06cc\u0645.<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u063a\u0648\u0627\u0635\u06cc\u060c \u0630\u06a9\u0631 \u0627\u06cc\u0646 \u0646\u06a9\u062a\u0647 \u0636\u0631\u0648\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0631\u0633\u0645\u06cc \u0641\u0644\u0627\u062a\u0631 \u06cc\u06a9 \u0646\u0642\u0637\u0647 \u0634\u0631\u0648\u0639 \u0639\u0627\u0644\u06cc \u0627\u0633\u062a. \u0627\u06cc\u0646 \u0646\u0645\u0648\u0646\u0647\u200c\u0647\u0627\u06cc \u0633\u0627\u062f\u0647 \u0648 \u06a9\u0627\u0631\u0628\u0631\u062f\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u062f\u0631\u06a9 \u06a9\u0627\u0645\u0644\u06cc \u0627\u0632 \u0646\u062d\u0648\u0647 \u06a9\u0627\u0631 \u06a9\u0631\u062f\u0646 \u0686\u06cc\u0632\u0647\u0627 \u0645\u06cc\u200c\u062f\u0647\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c \u062e\u0644\u0627\u0635\u0647\u200c\u0627\u06cc \u0627\u0632 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u06a9\u0644\u06cc\u062f\u06cc \u0631\u0627 \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u0628\u06cc\u0646\u0634\u200c\u0647\u0627\u06cc \u0634\u062e\u0635\u06cc \u06a9\u0647 \u0632\u0645\u0627\u0646 \u0632\u06cc\u0627\u062f\u06cc \u0631\u0627 \u0635\u0631\u0641 \u06a9\u0627\u0631 \u0628\u0627 \u0627\u06cc\u0646 \u0646\u0648\u0639 \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a\u060c \u062e\u0648\u0627\u0647\u06cc\u062f \u06cc\u0627\u0641\u062a.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%DA%86%D9%87_%D9%85%D8%B4%DA%A9%D9%84%DB%8C_%D8%B1%D8%A7_%D8%AD%D9%84_%D9%85%DB%8C_%DA%A9%D9%86%D8%AF%D8%9F\"><\/span>\n<p>  \u0686\u0647 \u0645\u0634\u06a9\u0644\u06cc \u0631\u0627 \u062d\u0644 \u0645\u06cc \u06a9\u0646\u062f\u061f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0628\u0631\u0627\u06cc \u062f\u0631\u06a9 \u0646\u0642\u0634 \u0648 \u0627\u0646\u0648\u0627\u0639 \u062a\u0633\u062a \u0647\u0627\u06cc \u0648\u06cc\u062c\u062a\u060c \u0627\u06cc\u0646 \u0648\u06cc\u062f\u06cc\u0648 \u0631\u0627 \u062f\u0631 \u06a9\u0627\u0646\u0627\u0644 \u06cc\u0648\u062a\u06cc\u0648\u0628 Flutter \u062a\u0645\u0627\u0634\u0627 \u06a9\u0646\u06cc\u062f. \u0627\u06cc\u0646 \u0633\u0647 \u0646\u0648\u0639 \u062a\u0633\u062a UI \u0631\u0627 \u062a\u0648\u0636\u06cc\u062d \u0645\u06cc \u062f\u0647\u062f:<\/p>\n<ol>\n<li>\u062a\u0633\u062a \u0647\u0627\u06cc \u0637\u0644\u0627\u06cc\u06cc (\u0645\u062a\u0645\u0631\u06a9\u0632 \u0628\u0631 \u067e\u06cc\u06a9\u0633\u0644 \u06a9\u0627\u0645\u0644)\u061b<\/li>\n<li>\u062a\u0633\u062a \u0647\u0627\u06cc \u06cc\u0627\u0628 (Comportamento);<\/li>\n<li>\u062a\u0633\u062a \u0647\u0627\u06cc PaitPattern (\u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc \u062a\u0631\u0633\u06cc\u0645)\u061b<\/li>\n<\/ol>\n<p>\u0645\u0627 \u0631\u0648\u06cc \u0646\u0648\u0639 \u062f\u0648\u0645 \u062a\u0645\u0631\u06a9\u0632 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06a9\u0631\u062f\u060c <code>Finder tests<\/code>\u060c \u06a9\u0647 \u0631\u0641\u062a\u0627\u0631 \u0627\u062c\u0632\u0627\u06cc \u0634\u0645\u0627 \u0631\u0627 \u062a\u0627\u06cc\u06cc\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u062f\u0631 \u0627\u0633\u0646\u0627\u062f Flutter \u0622\u0645\u062f\u0647 \u0627\u0633\u062a: &#8220;\u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u0648\u06cc\u062c\u062a \u0647\u0627 \u0646\u0647 \u062a\u0646\u0647\u0627 \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0631\u0627 \u0646\u0645\u0627\u06cc\u0634 \u0645\u06cc \u062f\u0647\u0646\u062f\u060c \u0628\u0644\u06a9\u0647 \u0628\u0647 \u062a\u0639\u0627\u0645\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0646\u06cc\u0632 \u067e\u0627\u0633\u062e \u0645\u06cc \u062f\u0647\u0646\u062f. \u0627\u06cc\u0646 \u0634\u0627\u0645\u0644 \u062f\u06a9\u0645\u0647 \u0647\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646 \u0631\u0648\u06cc \u0622\u0646\u0647\u0627 \u0636\u0631\u0628\u0647 \u0632\u062f \u0648 TextFields \u0628\u0631\u0627\u06cc \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0645\u062a\u0646.&#8221;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D9%81%D8%A7%D9%87%DB%8C%D9%85_%D8%A7%D8%B3%D8%A7%D8%B3%DB%8C\"><\/span>\n<p>  \u0645\u0641\u0627\u0647\u06cc\u0645 \u0627\u0633\u0627\u0633\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u062c\u0627\u062f \u0627\u06cc\u0646 \u0646\u0648\u0639 \u062a\u0633\u062a \u0628\u0633\u06cc\u0627\u0631 \u0634\u0628\u06cc\u0647 \u0628\u0647 \u062a\u0633\u062a \u0648\u0627\u062d\u062f \u0627\u0633\u062a. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0628\u0627\u06cc\u062f SDK \u062a\u0633\u062a \u0627\u0628\u0632\u0627\u0631\u06a9 Flutter \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight yaml\"><code><span class=\"na\">dev_dependencies<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">flutter_test<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">sdk<\/span><span class=\"pi\">:<\/span> <span class=\"s\">flutter<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u067e\u0633 \u0627\u0632 \u0627\u0646\u062c\u0627\u0645 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u0628\u0647 \u0631\u0648\u0634 \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0648 \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a \u0647\u0627\u06cc \u062e\u0648\u062f \u062f\u0633\u062a\u0631\u0633\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u062f\u0627\u0634\u062a.<\/p>\n<p>\u06cc\u06a9 \u0631\u0627\u0647 \u0633\u0631\u06cc\u0639 \u0628\u0631\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u062f\u0631 VSCode \u0628\u0627 \u06a9\u0644\u06cc\u06a9 \u0631\u0627\u0633\u062a \u0648 \u0627\u0646\u062a\u062e\u0627\u0628 \u06af\u0632\u06cc\u0646\u0647 Go to Test \u0627\u0633\u062a. \u0627\u06cc\u0646 \u062f\u0633\u062a\u0648\u0631 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u0622\u06cc\u0627 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0622\u0632\u0645\u0627\u06cc\u0634\u06cc \u0627\u0632 \u0642\u0628\u0644 \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06cc\u0627 \u062e\u06cc\u0631. \u0627\u06af\u0631 \u0646\u0647\u060c \u067e\u06cc\u0634\u0646\u0647\u0627\u062f \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9\u06cc \u0631\u0627 \u0645\u06cc \u062f\u0647\u062f. \u0627\u06cc\u0646 \u06cc\u06a9 \u062f\u0633\u062a\u0648\u0631 \u0633\u0627\u062f\u0647 \u0627\u0645\u0627 \u0645\u0641\u06cc\u062f \u0627\u0633\u062a\u060c \u0628\u0647 \u062e\u0635\u0648\u0635 \u06a9\u0647 \u062a\u0645\u0627\u0645 \u0644\u0627\u06cc\u0647 \u0647\u0627\u06cc \u067e\u0648\u0634\u0647 \u0644\u0627\u0632\u0645 \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0646 \u0641\u0627\u06cc\u0644 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0628\u0633\u06cc\u0627\u0631 \u062a\u0645\u06cc\u0632 &#8211; \u0622\u0646 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u06a9\u0646\u06cc\u062f!<\/p>\n<p><\/p>\n<p>\u062f\u0631 \u062f\u0627\u062e\u0644 \u0641\u0627\u06cc\u0644 \u062a\u0633\u062a \u062e\u0648\u062f\u060c \u0628\u0627\u06cc\u062f \u0686\u06cc\u0632\u06cc \u0634\u0628\u06cc\u0647 \u0628\u0647 \u0627\u06cc\u0646 \u0631\u0627 \u0628\u0628\u06cc\u0646\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"n\">testWidgets<\/span><span class=\"p\">(<\/span><span class=\"s\">'Test Description'<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"n\">WidgetTester<\/span> <span class=\"n\">tester<\/span><span class=\"p\">)<\/span> <span class=\"kd\">async<\/span> <span class=\"p\">{})<\/span>\n<\/code><\/pre>\n<\/div>\n<p><code>testWidgets<\/code>  \u0631\u0648\u0634\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a \u0647\u0627\u06cc \u0648\u06cc\u062c\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f \u0648 <code>tester<\/code> \u0627\u0628\u0632\u0627\u0631\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0628\u0631\u0627\u06cc \u06cc\u0627\u0641\u062a\u0646\u060c \u062a\u0639\u0627\u0645\u0644 \u0648 \u0645\u0648\u0627\u0631\u062f \u062f\u06cc\u06af\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646\u060c \u0628\u0627\u06cc\u062f \u0648\u06cc\u062c\u062a \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u062f. \u0631\u0627\u06cc\u062c \u062a\u0631\u06cc\u0646 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0628\u0647 \u0634\u0631\u062d \u0632\u06cc\u0631 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"k\">await<\/span> <span class=\"n\">tester<\/span><span class=\"o\">.<\/span><span class=\"na\">pumpWidget<\/span><span class=\"p\">(<\/span><span class=\"kd\">const<\/span> <span class=\"n\">MyWidget<\/span><span class=\"p\">());<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u06cc\u0646 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06a9\u0627\u0646 \u062e\u0648\u0628\u06cc \u0628\u0631\u0627\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0628\u0631\u062e\u06cc \u0627\u0632 \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u0627\u0648\u0644\u06cc\u0647 \u0628\u0631\u0627\u06cc \u0645\u0624\u0644\u0641\u0647 \u062e\u0648\u062f \u0627\u0633\u062a\u060c \u0645\u0627\u0646\u0646\u062f \u062a\u0646\u0638\u06cc\u0645\u0627\u062a \u062a\u0645 \u06cc\u0627 \u062d\u062a\u06cc \u062a\u0632\u0631\u06cc\u0642 \u0648\u0627\u0628\u0633\u062a\u06af\u06cc. \u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u062c\u0632\u0621 \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0628\u067e\u06cc\u0686\u06cc\u062f <code>MaterialApp<\/code> \u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u062f\u0627\u0634\u062a\u0646 \u062a\u0645\u0627\u0645 \u062a\u0645 \u0647\u0627\u06cc \u0644\u0627\u0632\u0645 \u0648 <code>MediaQuery<\/code> \u062a\u0646\u0638\u06cc\u0645\u0627\u062a\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"k\">await<\/span> <span class=\"n\">tester<\/span><span class=\"o\">.<\/span><span class=\"na\">pumpWidget<\/span><span class=\"p\">(<\/span><span class=\"n\">MaterialApp<\/span><span class=\"p\">(<\/span><span class=\"nl\">home:<\/span> <span class=\"kd\">const<\/span> <span class=\"n\">MyWidget<\/span><span class=\"p\">()));<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u0645\u06a9\u0627\u0646 \u06cc\u0627\u0628\u06cc \u0639\u0646\u0627\u0635\u0631 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0632 CommonFinders singleton \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f. \u0631\u0627\u0647\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u06cc\u0627\u0641\u062a\u0646 \u0639\u0646\u0635\u0631 \u0645\u0648\u0631\u062f \u0646\u0638\u0631 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u062f\u0647\u062f\u060c \u0648 \u0639\u0644\u0627\u0645\u062a \u06af\u0630\u0627\u0631\u06cc \u06a9\u0627\u0645\u0644\u0627\u064b \u0633\u0627\u062f\u0647 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"kd\">final<\/span> <span class=\"n\">buttonFinder<\/span> <span class=\"o\">=<\/span> <span class=\"n\">find<\/span><span class=\"o\">.<\/span><span class=\"na\">byType<\/span><span class=\"p\">(<\/span><span class=\"n\">ElevatedButton<\/span><span class=\"p\">)<\/span>\n<span class=\"kd\">final<\/span> <span class=\"n\">textFinder<\/span> <span class=\"o\">=<\/span> <span class=\"n\">find<\/span><span class=\"o\">.<\/span><span class=\"na\">text<\/span><span class=\"p\">(<\/span><span class=\"s\">'Hello world!'<\/span><span class=\"p\">)<\/span>\n<span class=\"kd\">final<\/span> <span class=\"n\">myWidgetByKeyFinder<\/span> <span class=\"o\">=<\/span> <span class=\"n\">find<\/span><span class=\"o\">.<\/span><span class=\"na\">byKey<\/span><span class=\"p\">(<\/span><span class=\"n\">Key<\/span><span class=\"p\">(<\/span><span class=\"s\">'MyWidget-Key'<\/span><span class=\"p\">))<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0645\u0647\u0645 \u0627\u0633\u062a \u06a9\u0647 \u062a\u0648\u062c\u0647 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627\u06cc \u0627\u06cc\u062c\u0627\u062f \u0634\u062f\u0647\u060c \u0645\u0627\u0646\u0646\u062f buttonFinder \u0648 textFinder\u060c \u0639\u0646\u0627\u0635\u0631 \u0648\u0627\u0642\u0639\u06cc \u0631\u0627 \u0630\u062e\u06cc\u0631\u0647 \u0646\u0645\u06cc \u06a9\u0646\u0646\u062f\u060c \u0628\u0644\u06a9\u0647 \u06cc\u06a9 &#8220;\u0631\u0627\u0647\u06cc&#8221; \u0628\u0631\u0627\u06cc \u06cc\u0627\u0641\u062a\u0646 \u0622\u0646\u0647\u0627 \u0647\u0633\u062a\u0646\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"n\">expect<\/span><span class=\"p\">(<\/span><span class=\"n\">buttonFinder<\/span><span class=\"p\">,<\/span> <span class=\"n\">findsOneWidget<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u062f\u0631 \u062a\u0633\u062a \u0628\u0627\u0644\u0627\u060c \u0645\u0646 \u062f\u0642\u06cc\u0642\u0627 \u0628\u0647 \u062f\u0646\u0628\u0627\u0644 \u06cc\u06a9 \u062f\u06a9\u0645\u0647 \u0647\u0633\u062a\u0645. \u0627\u06af\u0631 \u0647\u06cc\u0686 \u06cc\u0627 \u0628\u06cc\u0634 \u0627\u0632 \u06cc\u06a9 \u0645\u0648\u0631\u062f \u067e\u06cc\u062f\u0627 \u0646\u0634\u062f\u060c \u0622\u0632\u0645\u0648\u0646 \u0646\u0627\u0645\u0648\u0641\u0642 \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0628\u0627 \u0639\u0646\u0627\u0635\u0631\u060c \u0627\u0632 <code>tester<\/code> \u0627\u0631\u0627\u0626\u0647 \u0634\u062f\u0647 \u062a\u0648\u0633\u0637 <code>testWidgets<\/code> \u0631\u0648\u0634 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0642\u062f\u0627\u0645\u0627\u062a\u06cc \u0645\u0627\u0646\u0646\u062f \u0636\u0631\u0628\u0647 \u0632\u062f\u0646\u060c \u0648\u0627\u0631\u062f \u06a9\u0631\u062f\u0646 \u0645\u062a\u0646 \u06cc\u0627 \u06a9\u0634\u06cc\u062f\u0646 \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u06cc\u062f. \u0634\u0645\u0627 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062e\u0648\u062f \u0639\u0646\u0635\u0631 \u0631\u0627 \u0627\u0646\u062a\u062e\u0627\u0628 \u06a9\u0646\u06cc\u062f.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"k\">await<\/span> <span class=\"n\">tester<\/span><span class=\"o\">.<\/span><span class=\"na\">enterText<\/span><span class=\"p\">(<\/span><span class=\"n\">find<\/span><span class=\"o\">.<\/span><span class=\"na\">byType<\/span><span class=\"p\">(<\/span><span class=\"n\">TextField<\/span><span class=\"p\">),<\/span> <span class=\"s\">'hi'<\/span><span class=\"p\">);<\/span>\n\n<span class=\"k\">await<\/span> <span class=\"n\">tester<\/span><span class=\"o\">.<\/span><span class=\"na\">pump<\/span><span class=\"p\">()<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646\u06a9\u0647 \u062f\u0631\u062e\u062a \u0648\u06cc\u062c\u062a \u067e\u0633 \u0627\u0632 \u0634\u0628\u06cc\u0647 \u0633\u0627\u0632\u06cc \u062a\u0639\u0627\u0645\u0644 \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627\u0632\u0633\u0627\u0632\u06cc \u0645\u06cc \u0634\u0648\u062f\u060c \u067e\u0645\u067e() \u06cc\u0627 pumpAndSettle() \u0631\u0627 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u062e\u0644\u0627\u0635\u0647 \u0627\u06cc \u0627\u0632 \u0646\u062d\u0648\u0647 \u06a9\u0627\u0631 \u0622\u0646\u0647\u0627 \u0622\u0648\u0631\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D8%A8%DB%8C%D8%A7%DB%8C%DB%8C%D8%AF_%D8%AA%D9%85%D8%B1%DB%8C%D9%86_%DA%A9%D9%86%DB%8C%D9%85\"><\/span>\n<p>  \u0628\u06cc\u0627\u06cc\u06cc\u062f \u062a\u0645\u0631\u06cc\u0646 \u06a9\u0646\u06cc\u0645!<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u062c\u0632\u0621 \u0645\u062b\u0627\u0644 \u0645\u0627 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"kd\">class<\/span> <span class=\"nc\">PrimaryButton<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">StatelessWidget<\/span> <span class=\"p\">{<\/span>\n  <span class=\"n\">PrimaryButton<\/span><span class=\"p\">({<\/span>\n    <span class=\"kd\">required<\/span> <span class=\"kt\">String<\/span> <span class=\"n\">title<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">super<\/span><span class=\"o\">.<\/span><span class=\"na\">key<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">onTap<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">backgroundColor<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Colors<\/span><span class=\"o\">.<\/span><span class=\"na\">blue<\/span><span class=\"p\">,<\/span>\n    <span class=\"k\">this<\/span><span class=\"o\">.<\/span><span class=\"na\">isLoading<\/span> <span class=\"o\">=<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span>\n  <span class=\"p\">})<\/span> <span class=\"o\">:<\/span> <span class=\"n\">title<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Text<\/span><span class=\"p\">(<\/span>\n          <span class=\"n\">title<\/span><span class=\"p\">,<\/span>\n        <span class=\"p\">);<\/span>\n\n  <span class=\"kd\">final<\/span> <span class=\"n\">Widget<\/span> <span class=\"n\">title<\/span><span class=\"p\">;<\/span>\n  <span class=\"kd\">final<\/span> <span class=\"n\">VoidCallback<\/span><span class=\"o\">?<\/span> <span class=\"n\">onTap<\/span><span class=\"p\">;<\/span>\n  <span class=\"kd\">final<\/span> <span class=\"n\">Color<\/span> <span class=\"n\">backgroundColor<\/span><span class=\"p\">;<\/span>\n  <span class=\"kd\">final<\/span> <span class=\"kt\">bool<\/span> <span class=\"n\">isLoading<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"nd\">@override<\/span>\n  <span class=\"n\">Widget<\/span> <span class=\"n\">build<\/span><span class=\"p\">(<\/span><span class=\"n\">BuildContext<\/span> <span class=\"n\">context<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">ElevatedButton<\/span><span class=\"p\">(<\/span>\n        <span class=\"nl\">style:<\/span> <span class=\"n\">ButtonStyle<\/span><span class=\"p\">(<\/span>\n          <span class=\"nl\">backgroundColor:<\/span> <span class=\"n\">MaterialStateProperty<\/span><span class=\"o\">.<\/span><span class=\"na\">resolveWith<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Color<\/span><span class=\"p\">&gt;(<\/span>\n            <span class=\"p\">(<\/span><span class=\"kt\">Set<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">MaterialState<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">states<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n              <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"n\">isLoading<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n                <span class=\"k\">return<\/span> <span class=\"n\">Colors<\/span><span class=\"o\">.<\/span><span class=\"na\">grey<\/span><span class=\"p\">;<\/span>\n              <span class=\"p\">}<\/span>\n\n              <span class=\"k\">return<\/span> <span class=\"n\">backgroundColor<\/span><span class=\"p\">;<\/span>\n            <span class=\"p\">},<\/span>\n          <span class=\"p\">),<\/span>\n        <span class=\"p\">),<\/span>\n        <span class=\"nl\">onPressed:<\/span> <span class=\"n\">isLoading<\/span> <span class=\"o\">?<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">:<\/span> <span class=\"n\">onTap<\/span><span class=\"p\">,<\/span>\n        <span class=\"nl\">child:<\/span> <span class=\"n\">isLoading<\/span> <span class=\"o\">?<\/span> <span class=\"kd\">const<\/span> <span class=\"n\">CircularProgressIndicator<\/span><span class=\"p\">()<\/span> <span class=\"o\">:<\/span> <span class=\"n\">title<\/span><span class=\"p\">,<\/span>\n      <span class=\"p\">);<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0631\u0641\u062a\u0627\u0631\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0644\u0627\u0641\u0627\u0635\u0644\u0647 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u0627\u0639\u062a\u0628\u0627\u0631 \u0628\u0631\u062c\u0633\u062a\u0647 \u0645\u06cc \u0634\u0648\u0646\u062f \u0639\u0628\u0627\u0631\u062a\u0646\u062f \u0627\u0632:<\/p>\n<ul>\n<li>\u062a\u063a\u06cc\u06cc\u0631 \u0631\u0646\u06af \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647\u061b<\/li>\n<li>\u0648\u0642\u062a\u06cc isLoading \u062f\u0631\u0633\u062a \u0627\u0633\u062a:\n<ul>\n<li>onTap \u0646\u0628\u0627\u06cc\u062f \u0642\u0627\u0628\u0644 \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0628\u0627\u0634\u062f.<\/li>\n<li>\u06cc\u06a9 CircularProgressIndicator \u0628\u0627\u06cc\u062f \u0628\u0647 \u062c\u0627\u06cc \u0639\u0646\u0648\u0627\u0646 \u0645\u0627 \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0634\u0648\u062f.<\/li>\n<li>backgroundColor \u0628\u0627\u06cc\u062f Colors.grey \u0628\u0627\u0634\u062f.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>\u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc <code>backgroundColor<\/code> \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f<\/strong><\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0645\u0624\u0644\u0641\u0647 \u062e\u0648\u062f \u0631\u0627 \u0628\u0631\u0627\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0622\u0645\u0627\u062f\u0647 \u06a9\u0646\u06cc\u0645:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"n\">testWidgets<\/span><span class=\"p\">(<\/span><span class=\"s\">'Slould be able to render and interact with PrimaryButton'<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">(<\/span><span class=\"n\">tester<\/span><span class=\"p\">)<\/span> <span class=\"kd\">async<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">await<\/span> <span class=\"n\">tester<\/span><span class=\"o\">.<\/span><span class=\"na\">pumpWidget<\/span><span class=\"p\">(<\/span><span class=\"n\">MaterialApp<\/span><span class=\"p\">(<\/span>\n    <span class=\"nl\">home:<\/span> <span class=\"n\">PrimaryButton<\/span><span class=\"p\">(<\/span>\n      <span class=\"nl\">title:<\/span> <span class=\"s\">'title'<\/span><span class=\"p\">,<\/span>\n      <span class=\"nl\">backgroundColor:<\/span> <span class=\"n\">Colors<\/span><span class=\"o\">.<\/span><span class=\"na\">red<\/span><span class=\"p\">,<\/span>\n      <span class=\"nl\">onTap:<\/span> <span class=\"p\">()<\/span> <span class=\"p\">{},<\/span>\n    <span class=\"p\">),<\/span>\n  <span class=\"p\">));<\/span>\n\n  <span class=\"c1\">\/\/ ...<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u062d\u0627\u0644\u0627 \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0622\u06cc\u0627 \u0631\u0646\u06af \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0633\u0641\u0627\u0631\u0634\u06cc \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u0627\u0639\u0645\u0627\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631.<\/p>\n<p><strong>\u0645\u0647\u0645 \u0627\u0633\u062a<\/strong><\/p>\n<p>\u062f\u06a9\u0645\u0647 \u0631\u0646\u062f\u0631 \u0634\u062f\u0647 \u0631\u0648\u06cc \u0635\u0641\u062d\u0647 \u0627\u06cc\u0646 \u0646\u06cc\u0633\u062a <code>PrimaryButton<\/code> \u0627\u0645\u0627 \u06cc\u06a9 <code>ElevatedButton<\/code>\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0647\u0627 \u0648 \u062a\u0639\u0627\u0645\u0644\u0627\u062a \u0628\u0627\u06cc\u062f \u0631\u0648\u06cc \u0627\u06cc\u0646 \u0645\u0624\u0644\u0641\u0647 \u0627\u0646\u062c\u0627\u0645 \u0634\u0648\u062f\u060c \u0646\u0647 \u0648\u0627\u0644\u062f \u0622\u0646. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c <code>onTap<\/code> \u0631\u0648\u0634 \u062f\u0631 <code>PrimaryButton<\/code>; \u0627\u06af\u0631 \u0633\u0639\u06cc \u06a9\u0646\u06cc\u062f \u0628\u0647 \u0622\u0646 \u0636\u0631\u0628\u0647 \u0628\u0632\u0646\u06cc\u062f\u060c \u0647\u06cc\u0686 \u0627\u062a\u0641\u0627\u0642\u06cc \u0646\u0645\u06cc \u0627\u0641\u062a\u062f. \u0627\u0645\u0627 \u0628\u0627 \u0622\u0646 \u06a9\u0627\u0631 \u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f <code>ElevatedButton<\/code>.<\/p>\n<p>\u0647\u0645\u06cc\u0646 \u0645\u0641\u0647\u0648\u0645 \u062f\u0631 \u0645\u0648\u0631\u062f \u06a9\u0644\u06cc\u062f\u0647\u0627 \u0646\u06cc\u0632 \u0635\u062f\u0642 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06af\u0631 \u0645\u06cc \u062e\u0648\u0627\u0647\u06cc\u062f \u0639\u0646\u0635\u0631\u06cc \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06cc\u06a9 \u06a9\u0644\u06cc\u062f \u0634\u0646\u0627\u0633\u0627\u06cc\u06cc \u06a9\u0646\u06cc\u062f\u060c \u0628\u0627\u06cc\u062f \u0628\u062f\u0627\u0646\u06cc\u062f \u06a9\u0647 \u06a9\u0644\u06cc\u062f \u0631\u0627 \u0628\u0647 \u06a9\u062f\u0627\u0645 \u0648\u06cc\u062c\u062a \u0627\u062e\u062a\u0635\u0627\u0635 \u062f\u0647\u06cc\u062f. \u062f\u0631 \u0645\u062b\u0627\u0644 \u0645\u0627\u060c \u06a9\u0644\u06cc\u062f \u0627\u0632 <code>PrimaryButton<\/code> \u0628\u0627 \u0641\u0631\u0632\u0646\u062f\u0634 \u06cc\u06a9\u06cc \u0646\u06cc\u0633\u062a <code>ElevatedButton<\/code>. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0627\u06af\u0631 \u0633\u0639\u06cc \u0645\u06cc \u06a9\u0646\u06cc\u062f \u062a\u062d\u0631\u06cc\u06a9 \u06a9\u0646\u06cc\u062f <code>onTap<\/code> \u0627\u0632 \u0637\u0631\u06cc\u0642 \u0648\u0627\u0644\u062f\u06cc\u0646\u060c \u06a9\u0627\u0631 \u0646\u062e\u0648\u0627\u0647\u062f \u06a9\u0631\u062f. \u0628\u0631\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u06a9\u0644\u06cc\u062f\u0647\u0627\u06cc \u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a Flutter \u067e\u06cc\u0634\u200c\u0641\u0631\u0636\u060c \u0628\u0627\u06cc\u062f \u0622\u0646\u0647\u0627 \u0631\u0627 \u06af\u0633\u062a\u0631\u0634 \u062f\u0647\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"kd\">class<\/span> <span class=\"nc\">PrimaryButton<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">ElevatedButton<\/span> <span class=\"p\">{}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0647 \u0627\u06cc\u0646 \u062a\u0631\u062a\u06cc\u0628\u060c \u0645\u0633\u0627\u0626\u0644 \u0630\u06a9\u0631 \u0634\u062f\u0647 \u062f\u0631 \u0628\u0627\u0644\u0627 \u0631\u062e \u0646\u062e\u0648\u0627\u0647\u062f \u062f\u0627\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u062d\u0627\u0644\u060c \u0645\u0646 \u062a\u0631\u062c\u06cc\u062d \u062f\u0627\u062f\u0645 \u0627\u0632 \u0627\u06cc\u0646 \u06a9\u0627\u0645\u067e\u0648\u0646\u0646\u062a \u0647\u0645\u0627\u0646\u0637\u0648\u0631 \u06a9\u0647 \u0647\u0633\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u0645\u060c \u0632\u06cc\u0631\u0627 \u0627\u0632 \u06af\u0633\u062a\u0631\u0634 \u0648\u06cc\u062c\u062a\u200c\u0647\u0627 \u0631\u0627\u06cc\u062c\u200c\u062a\u0631 \u0627\u0633\u062a.<\/p>\n<p>\u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u0631\u0646\u06af\u06cc \u06a9\u0647 \u0645\u0627 \u0627\u0631\u0633\u0627\u0644 \u06a9\u0631\u062f\u06cc\u0645 \u0648\u0627\u0642\u0639\u0627\u064b \u0627\u0639\u0645\u0627\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u062f\u0647\u06cc\u0645:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"kd\">final<\/span> <span class=\"n\">buttonFinder<\/span> <span class=\"o\">=<\/span> <span class=\"n\">find<\/span><span class=\"o\">.<\/span><span class=\"na\">byType<\/span><span class=\"p\">(<\/span><span class=\"n\">ElevatedButton<\/span><span class=\"p\">);<\/span>\n<span class=\"kd\">final<\/span> <span class=\"n\">buttonWidget<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tester<\/span><span class=\"o\">.<\/span><span class=\"na\">widget<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">ElevatedButton<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">buttonFinder<\/span><span class=\"p\">);<\/span>\n\n<span class=\"n\">expect<\/span><span class=\"p\">(<\/span>\n  <span class=\"n\">buttonWidget<\/span><span class=\"o\">.<\/span><span class=\"na\">style<\/span><span class=\"o\">?.<\/span><span class=\"na\">backgroundColor<\/span><span class=\"o\">?.<\/span><span class=\"na\">resolve<\/span><span class=\"p\">({}),<\/span>\n  <span class=\"n\">Colors<\/span><span class=\"o\">.<\/span><span class=\"na\">red<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">);<\/span>\n<span class=\"n\">expect<\/span><span class=\"p\">(<\/span><span class=\"n\">find<\/span><span class=\"o\">.<\/span><span class=\"na\">text<\/span><span class=\"p\">(<\/span><span class=\"s\">'title'<\/span><span class=\"p\">),<\/span> <span class=\"n\">findsOneWidget<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0627 \u0638\u0647\u0648\u0631 Material3 \u0648 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc <code>MaterialStateProperty<\/code>\u060c \u0645\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>resolve<\/code> \u0631\u0648\u0634\u06cc \u0628\u0631\u0627\u06cc \u0628\u0647 \u062f\u0633\u062a \u0622\u0648\u0631\u062f\u0646 \u0648\u06cc\u0698\u06af\u06cc \u062c\u0632\u0621 \u0628\u0631\u0627\u06cc \u06cc\u06a9 \u062d\u0627\u0644\u062a \u062e\u0627\u0635. \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0647\u06cc\u0686 \u062d\u0627\u0644\u062a\u06cc \u0631\u0627 \u067e\u0627\u0633 \u0646\u06a9\u0631\u062f\u06cc\u0645\u060c \u0627\u0632 \u06cc\u06a9 \u062e\u0627\u0644\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f\u0645 <code>Set<\/code>.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/media.dev.to\/cdn-cgi\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvz6slxxkbozvqgxhfsb.png\" alt=\"first_test\" width=\"394\" height=\"53\" title=\"\"><\/p>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0645\u0627 \u0627\u06a9\u0646\u0648\u0646 \u06a9\u0627\u0645\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0628\u0639\u062f\u060c \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0622\u0646 \u062a\u0639\u0627\u0645\u0644 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u0645 <code>onTap<\/code> \u0631\u0648\u0634<\/p>\n<p><strong>\u062a\u0639\u0627\u0645\u0644 \u0628\u0627 <code>onTap<\/code> \u0631\u0648\u0634<\/strong><\/p>\n<p>\u06cc\u06a9 \u0631\u0627\u0647 \u0633\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u062a\u0623\u06cc\u06cc\u062f \u0627\u06cc\u0646\u06a9\u0647 \u0622\u06cc\u0627 \u0645\u062a\u062f \u0641\u0631\u0627\u062e\u0648\u0627\u0646\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a \u06cc\u0627 \u062e\u06cc\u0631\u060c \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u06cc \u0645\u0627\u0646\u0646\u062f \u0627\u0633\u062a <code>mockito<\/code> \u06cc\u0627 <code>mocktail<\/code>.\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"kd\">class<\/span> <span class=\"nc\">OnTapMock<\/span> <span class=\"kd\">extends<\/span> <span class=\"n\">Mock<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kt\">void<\/span> <span class=\"n\">call<\/span><span class=\"p\">();<\/span>\n<span class=\"p\">}<\/span>\n\n<span class=\"kt\">void<\/span> <span class=\"nf\">main<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\n  <span class=\"kd\">late<\/span> <span class=\"n\">OnTapMock<\/span> <span class=\"n\">onTapMock<\/span><span class=\"p\">;<\/span>\n\n  <span class=\"n\">setUp<\/span><span class=\"p\">(()<\/span> <span class=\"p\">{<\/span>\n    <span class=\"n\">onTapMock<\/span> <span class=\"o\">=<\/span> <span class=\"n\">OnTapMock<\/span><span class=\"p\">();<\/span>\n  <span class=\"p\">});<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0645\u0627 \u0627\u06cc\u0646 \u0633\u0627\u062e\u062a\u06af\u06cc \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u062a\u0645\u0627\u0633 \u0628\u0631\u0627\u06cc <code>onTap<\/code> \u0631\u0648\u0634 \u0648 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0627\u0639\u062a\u0628\u0627\u0631 \u0633\u0646\u062c\u06cc:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"n\">verifyNever<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">onTapMock<\/span><span class=\"p\">());<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u062d\u0627\u0644 \u0628\u0631\u0627\u06cc \u062a\u0639\u0627\u0645\u0644 \u0648\u0627\u0642\u0639\u06cc:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"k\">await<\/span> <span class=\"n\">tester<\/span><span class=\"o\">.<\/span><span class=\"na\">tap<\/span><span class=\"p\">(<\/span><span class=\"n\">buttonFinder<\/span><span class=\"p\">);<\/span>\n\n<span class=\"n\">verify<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">onTapMock<\/span><span class=\"p\">());<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0633\u0627\u062f\u0647 \u0627\u0633\u062a\u060c \u062f\u0631\u0633\u062a \u0627\u0633\u062a\u061f<\/p>\n<p><strong>\u0647\u0646\u062f\u0644\u06cc\u0646\u06af <code>isLoading == true<\/code><\/strong><\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0627 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u062a\u0633\u062a \u062c\u062f\u06cc\u062f \u0634\u0631\u0648\u0639 \u06a9\u0646\u06cc\u0645:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"n\">testWidgets<\/span><span class=\"p\">(<\/span><span class=\"s\">'Slould be able to validate PrimaryButton behaivor with isLoading equals true'<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">(<\/span><span class=\"n\">tester<\/span><span class=\"p\">)<\/span> <span class=\"kd\">async<\/span> <span class=\"p\">{<\/span>\n  <span class=\"k\">await<\/span> <span class=\"n\">tester<\/span><span class=\"o\">.<\/span><span class=\"na\">pumpWidget<\/span><span class=\"p\">(<\/span><span class=\"n\">MaterialApp<\/span><span class=\"p\">(<\/span>\n    <span class=\"nl\">home:<\/span> <span class=\"n\">PrimaryButton<\/span><span class=\"p\">(<\/span>\n      <span class=\"nl\">title:<\/span> <span class=\"s\">'title'<\/span><span class=\"p\">,<\/span>\n      <span class=\"nl\">backgroundColor:<\/span> <span class=\"n\">Colors<\/span><span class=\"o\">.<\/span><span class=\"na\">red<\/span><span class=\"p\">,<\/span>\n      <span class=\"nl\">onTap:<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">onTapMock<\/span><span class=\"p\">(),<\/span>\n      <span class=\"nl\">isLoading:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\n    <span class=\"p\">),<\/span>\n  <span class=\"p\">));<\/span>\n<span class=\"p\">});<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0648 \u0627\u0639\u062a\u0628\u0627\u0631\u0633\u0646\u062c\u06cc \u0647\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0635\u0648\u0631\u062a \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight dart\"><code><span class=\"kd\">final<\/span> <span class=\"n\">buttonFinder<\/span> <span class=\"o\">=<\/span> <span class=\"n\">find<\/span><span class=\"o\">.<\/span><span class=\"na\">byType<\/span><span class=\"p\">(<\/span><span class=\"n\">ElevatedButton<\/span><span class=\"p\">);<\/span>\n<span class=\"kd\">final<\/span> <span class=\"n\">buttonWidget<\/span> <span class=\"o\">=<\/span> <span class=\"n\">tester<\/span><span class=\"o\">.<\/span><span class=\"na\">widget<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">ElevatedButton<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">buttonFinder<\/span><span class=\"p\">);<\/span>\n\n<span class=\"n\">expect<\/span><span class=\"p\">(<\/span>\n  <span class=\"n\">buttonWidget<\/span><span class=\"o\">.<\/span><span class=\"na\">style<\/span><span class=\"o\">?.<\/span><span class=\"na\">backgroundColor<\/span><span class=\"o\">?.<\/span><span class=\"na\">resolve<\/span><span class=\"p\">({}),<\/span>\n  <span class=\"n\">Colors<\/span><span class=\"o\">.<\/span><span class=\"na\">grey<\/span><span class=\"p\">,<\/span>\n<span class=\"p\">);<\/span>\n<span class=\"n\">expect<\/span><span class=\"p\">(<\/span><span class=\"n\">find<\/span><span class=\"o\">.<\/span><span class=\"na\">text<\/span><span class=\"p\">(<\/span><span class=\"s\">'title'<\/span><span class=\"p\">),<\/span> <span class=\"n\">findsNothing<\/span><span class=\"p\">);<\/span>\n<span class=\"n\">expect<\/span><span class=\"p\">(<\/span><span class=\"n\">find<\/span><span class=\"o\">.<\/span><span class=\"na\">byType<\/span><span class=\"p\">(<\/span><span class=\"n\">CircularProgressIndicator<\/span><span class=\"p\">),<\/span> <span class=\"n\">findsOneWidget<\/span><span class=\"p\">);<\/span>\n<span class=\"n\">verifyNever<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">onTapMock<\/span><span class=\"p\">());<\/span>\n\n<span class=\"k\">await<\/span> <span class=\"n\">tester<\/span><span class=\"o\">.<\/span><span class=\"na\">tap<\/span><span class=\"p\">(<\/span><span class=\"n\">buttonFinder<\/span><span class=\"p\">);<\/span>\n\n<span class=\"n\">verifyNever<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">onTapMock<\/span><span class=\"p\">());<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0647 \u0627\u06cc\u0646 \u062a\u0631\u062a\u06cc\u0628\u060c \u0645\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0627 <code>isLoading == true<\/code> \u062a\u06a9\u06cc\u0647 \u06af\u0627\u0647:<\/p>\n<ol>\n<li>\u0631\u0646\u06af \u067e\u0633 \u0632\u0645\u06cc\u0646\u0647 \u0628\u0647 \u062f\u0631\u0633\u062a\u06cc \u062a\u0646\u0638\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/li>\n<li>\u0639\u0646\u0648\u0627\u0646 \u0627\u0631\u0627\u0626\u0647 \u0646\u0634\u062f\u0647 \u0627\u0633\u062a.<\/li>\n<li>\u0631\u0627 <code>CircularProgressIndicator<\/code> \u0646\u0645\u0627\u06cc\u0634 \u062f\u0627\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f\u061b<\/li>\n<li>\u0636\u0631\u0628\u0647 \u0632\u062f\u0646 \u0631\u0648\u06cc \u062f\u06a9\u0645\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a\u060c \u067e\u0627\u0633\u062e \u062a\u0645\u0627\u0633 \u0631\u0627 \u0622\u063a\u0627\u0632 \u0646\u0645\u06cc \u06a9\u0646\u062f.<\/li>\n<\/ol>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0627 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062e\u0627\u0637\u0631 \u0627\u06cc\u0646 \u0645\u0624\u0644\u0641\u0647 \u0631\u0627 \u0627\u0635\u0644\u0627\u062d \u06a9\u0646\u06cc\u0645\u060c \u0632\u06cc\u0631\u0627 \u0645\u06cc\u200c\u062f\u0627\u0646\u06cc\u0645 \u06a9\u0647 \u0631\u0641\u062a\u0627\u0631 \u0622\u0646 \u062b\u0627\u0628\u062a \u0627\u0633\u062a.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u062f\u0631 Flutter \u06cc\u06a9 \u0641\u0631\u0622\u06cc\u0646\u062f \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0648 \u0644\u0630\u062a \u0628\u062e\u0634 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0631\u0641\u062a\u0627\u0631 \u0627\u062c\u0632\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0648\u062b\u0631 \u062a\u0623\u06cc\u06cc\u062f \u06a9\u0646\u06cc\u062f. \u06af\u0627\u0647\u06cc \u0627\u0648\u0642\u0627\u062a\u060c \u0627\u06cc\u0646 \u0622\u0632\u0645\u0627\u06cc\u0634\u200c\u0647\u0627 \u0627\u0632 \u0634\u0645\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u0646\u062f \u06a9\u0647 \u062f\u0631 \u0645\u0648\u0631\u062f \u0633\u0627\u062e\u062a\u0627\u0631 \u0627\u062c\u0632\u0627\u06cc \u062e\u0648\u062f \u062a\u062c\u062f\u06cc\u062f \u0646\u0638\u0631 \u06a9\u0646\u06cc\u062f\u060c \u0627\u0645\u0627 \u0627\u06cc\u0646 \u0634\u0628\u06cc\u0647 \u0622\u0646\u0686\u0647 \u062f\u0631 \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u0648\u0627\u062d\u062f \u0627\u062a\u0641\u0627\u0642 \u0645\u06cc\u200c\u0627\u0641\u062a\u062f\u060c \u0627\u0633\u062a\u060c \u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0647\u0628\u0648\u062f \u0631\u0648\u0634\u06cc \u06a9\u0647 \u0631\u0648\u0634\u200c\u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u0648 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0627\u0628\u0633\u062a\u06af\u06cc\u200c\u0647\u0627 \u0645\u0646\u062c\u0631 \u0628\u0647 \u06a9\u062f \u0642\u0648\u06cc\u200c\u062a\u0631 \u0648 \u0642\u0627\u0628\u0644 \u0622\u0632\u0645\u0627\u06cc\u0634 \u0645\u06cc\u200c\u0634\u0648\u062f.<\/p>\n<p>\u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u062a\u0633\u062a\u200c\u0647\u0627 \u0647\u0646\u06af\u0627\u0645 \u0627\u06cc\u062c\u0627\u062f \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u062f\u0631 \u06a9\u062f\u060c \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0628\u06cc\u0634\u062a\u0631\u06cc \u0628\u0647 \u0647\u0645\u0631\u0627\u0647 \u0645\u06cc\u200c\u0622\u0648\u0631\u062f \u0648 \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u0645\u06cc\u200c\u062f\u0647\u062f \u06a9\u0647 \u0631\u0641\u062a\u0627\u0631 \u0645\u0648\u0631\u062f \u0646\u0638\u0631 \u062f\u0633\u062a \u0646\u062e\u0648\u0631\u062f\u0647 \u0628\u0627\u0642\u06cc \u0645\u06cc\u200c\u0645\u0627\u0646\u062f. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0627\u06af\u0631 \u0647\u0646\u0648\u0632 \u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u0631\u0627 \u062f\u0631 \u06af\u0631\u062f\u0634 \u06a9\u0627\u0631 \u062e\u0648\u062f \u0627\u062f\u063a\u0627\u0645 \u0646\u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f\u060c \u0627\u06a9\u0646\u0648\u0646 \u0632\u0645\u0627\u0646 \u0645\u0646\u0627\u0633\u0628\u06cc \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0627\u0633\u062a.<\/p>\n<p>\u0627\u06cc\u0646 \u0647\u0645\u0647 \u0628\u0631\u0627\u06cc \u0627\u0645\u0631\u0648\u0632 \u0627\u0633\u062a! \u062f\u0641\u0639\u0647 \u0628\u0639\u062f \u0645\u06cc \u0628\u06cc\u0646\u0645\u062a!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u06a9\u0645\u06cc \u0632\u0645\u06cc\u0646\u0647 \u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u0646\u0648\u0639\u06cc \u0622\u0632\u0645\u0627\u06cc\u0634 \u0627\u0633\u062a \u06a9\u0647 \u06af\u0627\u0647\u06cc \u062f\u0633\u062a \u06a9\u0645 \u06af\u0631\u0641\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f\u060c \u0627\u0645\u0627 \u0627\u0631\u0632\u0634 \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u062f\u0627\u0631\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u062a\u0633\u062a \u0648\u06cc\u062c\u062a \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u060c \u0646\u06a9\u0627\u062a\u06cc \u0631\u0627 \u0627\u0631\u0627\u0626\u0647 \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u0628\u0647 \u0634\u0645\u0627 \u06a9\u0645\u06a9 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0622\u0646 \u0631\u0627 \u062f\u0631 \u062c\u0631\u06cc\u0627\u0646 \u06a9\u0627\u0631 \u0631\u0648\u0632\u0627\u0646\u0647 \u062e\u0648\u062f \u0628\u06af\u0646\u062c\u0627\u0646\u06cc\u062f\u060c \u0648 \u06a9\u0627\u0631\u0628\u0631\u062f\u0647\u0627\u06cc &hellip;<\/p>\n","protected":false},"author":2,"featured_media":73388,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-73387","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/73387","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=73387"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/73387\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/73388"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=73387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=73387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=73387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}