brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
flutter-testingWrite unit, widget, and integration tests with robot patterns, widget keys, and Patrol in Flutter. Use when implementing test behavior; defer CI-only configuration without test changes.
Independent GitHub snapshot · Automated classification · Original documentation governs
The Four Pillars provide a qualitative reasoning framework to assess test value:
Avoid calculating or inventing arbitrary numeric scores (e.g. $P \times R \times F \times M$) statically without measured mutation or runtime evidence.
[MOB-TEST-01] Tripartite Naming: Name tests Method_Scenario_ExpectedBehavior.[MOB-TEST-02] BLoC State Invariant Rule: Assert state transitions using isA<State>().having(...) predicates; BAN full copyWith mirrors.[MOB-TEST-03] Entity Invariant & Serialization Rule: Test calculations, validations, domain invariants, and non-trivial serialization/parsing or error mapping. BAN testing generated code, trivial getters/setters, props, or echo tests (expect(item.discount, equals(5))) where the test merely repeats literal assignments.[MOB-TEST-04] Contract Testing Rule: Repositories and data sources must be tested for contract compliance, golden JSON parsing, and error mapping. BAN 1:1 pass-through mock echoing (when(() => dataSource.get()).thenAnswer((_) async => x); expect(await repo.get(), x)).[MOB-TEST-05] Bug-First Regression Lock: Every PR fixing a bug ticket or with title fix(...) must introduce a failing test reproducing the defect before fixing it.[MOB-TEST-01] (Method_Scenario_ExpectedBehavior).OrderBuilder); avoid brittle shared global mocks._integration_test.dart ONLY in integration_test/.BaseRobot) — never raw find.*/expect() in test body. Use WidgetKeys constants from lib/core/keys/.expectXxxNotVisible() in robot only when absence is part of the business contract (e.g. restricted action hidden), not blanket pairs for unrelated content.TestWrapper.init() and tester.pumpLocalizedWidget(...). Register mock BLoCs with GetIt in setUpAll; stub state and stream in setUp (use whenListen and settle: false for loading/transition states). Prohibit any().patrolTest with IntegrationAuthHelper.loginOrSkip($) for auth flows and native interactions ($.native.*).[MOB-TEST-01] Vague names: Banish non-descriptive names (testCart).[MOB-TEST-02] Brittle state mirrors: Ban 30-property copyWith trees in blocTest; use isA<State>().having(...).[MOB-TEST-03] Entity echo tests: Ban asserting trivial field assignments or auto-generated boilerplate (discount: 5). Meaningful serialization/parsing error handling remains valid.[MOB-TEST-04] Pass-through mock echoing: Ban 1:1 repository-to-datasource pass-through mocks without contract assertions.[MOB-TEST-05] Missing bug reproduction: Ban bug fix PRs without reproduction tests.WidgetKeys constant. No any(): Use typed matchers.test/shared/. No missing bloc stub: Stub state + stream.find.*/expect() to robot. No raw find in integration tests..toUpperCase(), .tr() in source.isA<State>().having(...).patrolTest.flutter test passes.When this skill applies, preserve the following domain terminology or equivalent concrete examples in the answer when relevant:
GetIt in setUpAll before building the widget under test.