From cdc08861b804aff9b7053bec306533d18db1a336 Mon Sep 17 00:00:00 2001 From: samuelematias Date: Wed, 2 Dec 2020 17:54:09 -0300 Subject: [PATCH] feat(test): Using golden files to verify pixel-perfect widgets --- README.md | 2 ++ test/calculator_app_test.dart | 8 ++++++++ test/failures/calculator_app_isolatedDiff.png | Bin 0 -> 17127 bytes test/failures/calculator_app_maskedDiff.png | Bin 0 -> 25392 bytes test/failures/calculator_app_masterImage.png | Bin 0 -> 25393 bytes test/failures/calculator_app_testImage.png | Bin 0 -> 25389 bytes test/goldens/calculator_app.png | Bin 0 -> 25393 bytes 7 files changed, 10 insertions(+) create mode 100644 test/failures/calculator_app_isolatedDiff.png create mode 100644 test/failures/calculator_app_maskedDiff.png create mode 100644 test/failures/calculator_app_masterImage.png create mode 100644 test/failures/calculator_app_testImage.png create mode 100644 test/goldens/calculator_app.png diff --git a/README.md b/README.md index ef7bec8..2af618f 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,8 @@ Calculator - [Caster.IO](https://caster.io) project to showcase testing techniqu [Lesson 21: Verifying interactions with mockito](https://caster.io/lessons/lesson-21-verifying-interactions-with-mockito) 👉🏾 [Branch](https://github.com/samuelematias/calculator_app/tree/lesson21) +[Lesson 22: Using golden files to verify pixel-perfect widgets](https://caster.io/lessons/lesson-22-using-golden-files-to-verify-pixel-perfect-widgets) 👉🏾 [Branch](https://github.com/samuelematias/calculator_app/tree/lesson22) + ## License ``` diff --git a/test/calculator_app_test.dart b/test/calculator_app_test.dart index adeffba..f5a852e 100644 --- a/test/calculator_app_test.dart +++ b/test/calculator_app_test.dart @@ -5,6 +5,14 @@ import 'package:flutter_test/flutter_test.dart'; void main() { group('CalculatorApp', () { + testWidgets('matches golden file', (tester) async { + await tester.pumpWidget(CalculatorApp()); + await expectLater( + find.byType(CalculatorApp), + matchesGoldenFile('goldens/calculator_app.png'), + ); + }); + testWidgets('renders four widgets of type TwoDigitOperation', (WidgetTester tester) async { await tester.pumpWidget(CalculatorApp()); diff --git a/test/failures/calculator_app_isolatedDiff.png b/test/failures/calculator_app_isolatedDiff.png new file mode 100644 index 0000000000000000000000000000000000000000..5768cc674d9ebe39bc434293a247962cd1da15f6 GIT binary patch literal 17127 zcmeI)&nts*90%~vGqXL<{2B*En#YfmP!4j!tY>XI*i1_}Xi6?F!a+zQv>nzsNwM6B z8g{}#N!2n=Xrc>c1w<~SVu%T zHmlT5B)EyRJg<>gb}!!5@}wR%*<8FlCip%tkw`YF#WlJdzufejoMeu?irj3)Q9yEX z7mXpO~j<7+x? zXwFXweD>Cj5k2-Cgqoio?#7?9Q_G%3@leH#yy{LCX@Rm>77N@Q%aW>^MUT~!$+BM9 zW|7LdLY9q{*qm8_IL}6BvtXFDdoAqd}5$t{T~;K(jWi< z2tWV=5P$##AOHafKmY;|NC|9fwMv7!@pH?+3KR%H00Izz00bZa0SG_<0uX>enh9J5 zeO*MVx#WKV(yVl)+%rRoKG`I|za{p|zQ0db+6Hj=Wr3*By(D}T4aN47C$^dGQpn_< F{sM_~W9a|@ literal 0 HcmV?d00001 diff --git a/test/failures/calculator_app_maskedDiff.png b/test/failures/calculator_app_maskedDiff.png new file mode 100644 index 0000000000000000000000000000000000000000..1a3fe2ecaf99e7868d1edb99e970824821bde5b0 GIT binary patch literal 25392 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 literal 0 HcmV?d00001 diff --git a/test/failures/calculator_app_testImage.png b/test/failures/calculator_app_testImage.png new file mode 100644 index 0000000000000000000000000000000000000000..bdb9741345e1153ab5e578501370d3532a373bde GIT binary patch literal 25389 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 literal 0 HcmV?d00001