Overview
testWidgetModel method
The main testing tool is the testWidgetModel
function, which executes a test. The parameters it requires are the name of the test, the function preparing the WidgetModel
for testing, and the test function itself.
testFunction parameter
This is a function of the test itself. When passed the WidgetModel
, this function describes its behavior and verifies the result. The function also uses a tester to manipulate the phases of the WidgetModel
lifecycle and a BuildContext
mock.
Example
void main() {
late TestPageModelMock model;
late ThemeWrapperMock theme;
late TextThemeMock textTheme;
TestPageWidgetModel setUpWm() {
textTheme = TextThemeMock();
when(() => textTheme.headline4).thenReturn(null);
theme = ThemeWrapperMock();
when(() => theme.getTextTheme(any())).thenReturn(textTheme);
model = TestPageModelMock();
when(() => model.value).thenReturn(0);
when(() => model.increment()).thenAnswer((invocation) => Future.value(1));
return TestPageWidgetModel(model, theme);
}
testWidgetModel<TestPageWidgetModel, TestPageWidget>(
'counterStyle should be headline4',
setUpWm,
(wm, tester, context) {
final style = TextStyleMock();
when(() => textTheme.headline4).thenReturn(style);
tester.init();
expect(wm.counterStyle, style);
},
);
testWidgetModel<TestPageWidgetModel, TestPageWidget>(
'when call increment and before get answer valueState should be loading',
setUpWm,
(wm, tester, context) async {
tester.init();
when(() => model.increment()).thenAnswer(
(invocation) => Future.delayed(
const Duration(milliseconds: 30),
() => 1,
),
);
unawaited(wm.increment());
await Future<void>.delayed(
const Duration(milliseconds: 10),
);
final value = wm.valueState.value;
expect(value, isNotNull);
expect(value!.isLoading, isTrue);
},
);
}