如何在测试中正确重写自动生成的Riverpod NotifierProvider?
解决Riverpod测试中overrideWith的类型错误问题
问题出在两个核心点:
theNumberProvider绑定的Notifier是TheNumber类,你用独立的FakeNumber类去替换,类型不兼容——overrideWith要求返回**TheNumber类型**的实例,不是其他无关的Notifier子类。- 你给
overrideWith传了带ref参数的函数,但overrideWith的参数是无参的TheNumber Function(),所以触发类型不匹配错误。
下面是三种可行的解决办法:
办法一:直接修改原有Notifier的状态(无需额外类)
不用写FakeNumber,直接创建TheNumber实例并修改状态值:
theNumberProvider.overrideWith( () { final notifier = TheNumber(); notifier.state = 43; // 把测试值赋给状态 return notifier; }, )
办法二:让Fake类继承原有Notifier
如果一定要用单独的Fake类,让它继承自TheNumber而不是重新生成独立的Notifier:
// 删掉原来带@riverpod的FakeNumber,改成: class FakeNumber extends TheNumber { @override int build() { return 43; } } // 测试里的override写法: theNumberProvider.overrideWith( () => FakeNumber(), // 无参函数,返回TheNumber子类实例 )
办法三:用overrideWithValue直接替换状态值(最简单)
如果只是需要替换数值,完全不用创建Notifier实例,用overrideWithValue一步到位:
theNumberProvider.overrideWithValue(43)
完整测试代码示例(用办法三)
void main() { group('TheNumber Tests', () { testWidgets('Testing TheNumber', (tester) async { await tester.pumpWidget( ProviderScope( overrides: [ theNumberProvider.overrideWithValue(43), ], child: const MaterialApp( home: TheNumberWidget(), ), ), ); // 验证文本是否正确显示测试值 expect(find.text('TheNumber: 43'), findsOneWidget); }); }); }
内容的提问来源于stack exchange,提问作者Vindolin
相关产品推荐
相关产品推荐

