如何覆盖 Riverpod StateNotifier 的状态以进行测试
Posted
技术标签:
【中文标题】如何覆盖 Riverpod StateNotifier 的状态以进行测试【英文标题】:How to override the state of a Riverpod StateNotifier for testing 【发布时间】:2021-10-28 01:10:55 【问题描述】:我想手动覆盖我的StateNotifierProvider
状态以进行测试。可以使用ProviderContainer
或ProviderScope
来覆盖提供程序。但它只提供了覆盖通知器的选项,而不是状态。
我的问题是我应该如何覆盖状态?
【问题讨论】:
请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案1】:如果您想覆盖提供程序。例如,当您想要测试特定类别时。在这种情况下,我们可以用一个值覆盖 ScopedProvider。然后,在ProviderScope中,我们可以选择覆盖哪个provider,选择覆盖哪个值
testWidgets('Override the current scope', (tester) async
await tester.pumpWidget(ProviderScope(
overrides: [
selectedCategory.state.overrideWithValue(Category("Pear", Colors.green))
],
child: HookBuilder(builder: (context)
return MaterialApp(home: CategoryWidget());
)));
expect((tester.firstWidget(find.byType(Text)) as Text).style.color,
Colors.green);
expect((tester.firstWidget(find.byType(Text)) as Text).data, "Pear");
);
【讨论】:
感谢您的回答。为每个 StateNotifierProvider 添加一个函数只是为了测试是很多不必要的工作。此外,它可能会导致滥用该功能。我正在寻找一种无需向现有提供商添加任何内容的方法。 问题在于StateNotifierProvider
。 overrideWithValue
只允许 Notifiers
作为值。无法覆盖状态。
这篇文章对我有帮助,也许对你有帮助bartvwezel.nl/flutter/flutter-riverpod-testing-example
我也遇到了这个问题,我找不到一种方法来覆盖 StateNotifierProvider 的状态,它返回一个扩展 StateNotifier以上是关于如何覆盖 Riverpod StateNotifier 的状态以进行测试的主要内容,如果未能解决你的问题,请参考以下文章
Riverpod - 如何在消费者中包装 PreferredSizeWidget
RiverPod - 如何在不在小部件中的 AsyncValue 上等待使用 FutureProvider
如何在 Riverpod 中显示来自 StateNotifier 的小吃店?