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

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

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

【问题讨论】:

  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: flutter provider flutter-test flutter-provider riverpod


【解决方案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。我在这里发布了我的代码和状态架构的示例:stackoverflow.com/questions/70011054/…
猜你喜欢
  • 2021-11-27
  • 1970-01-01
  • 2021-03-17
  • 1970-01-01
  • 2023-02-01
  • 1970-01-01
  • 2021-04-21
  • 2021-12-28
  • 2016-10-14
相关资源
最近更新 更多