如何覆盖 Riverpod StateNotifier 的状态以进行测试

Posted

技术标签:

【中文标题】如何覆盖 Riverpod StateNotifier 的状态以进行测试【英文标题】:How to override the state of a Riverpod StateNotifier for testing 【发布时间】:2021-10-28 01:10:55 【问题描述】:

我想手动覆盖我的StateNotifierProvider 状态以进行测试。可以使用ProviderContainerProviderScope 来覆盖提供程序。但它只提供了覆盖通知器的选项,而不是状态。

我的问题是我应该如何覆盖状态?

【问题讨论】:

请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案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 添加一个函数只是为了测试是很多不必要的工作。此外,它可能会导致滥用该功能。我正在寻找一种无需向现有提供商添加任何内容的方法。 问题在于StateNotifierProvideroverrideWithValue 只允许 Notifiers 作为值。无法覆盖状态。 这篇文章对我有帮助,也许对你有帮助bartvwezel.nl/flutter/flutter-riverpod-testing-example 我也遇到了这个问题,我找不到一种方法来覆盖 StateNotifierProvider 的状态,它返回一个扩展 StateNotifier 的类。唯一可用的覆盖是 .notifier。我在这里发布了我的代码和状态架构的示例:***.com/questions/70011054/…

以上是关于如何覆盖 Riverpod StateNotifier 的状态以进行测试的主要内容,如果未能解决你的问题,请参考以下文章

Riverpod - 如何在消费者中包装 PreferredSizeWidget

RiverPod - 如何在不在小部件中的 AsyncValue 上等待使用 FutureProvider

如何在 Riverpod 中显示来自 StateNotifier 的小吃店?

Flutter Riverpod:如何实现 FutureProvider?

如何在不传递参数的情况下使用riverpod 系列提供程序

重走Flutter状态管理之路—Riverpod最终篇