mcpField
R
riverpod-testing

riverpod-testing

github.com/serverpod测试与质量1098 次安装34 周前更新
代码仓库

关于 riverpod-testing

这项 Riverpod skill 介绍 Dart 中有无 Flutter 时的 provider 测试方式,面向编写单元测试和 widget 测试的开发者。内容涵盖隔离容器、覆盖、异步 provider、监听及 Notifier 模拟。

主要功能

  1. 01为每项测试创建独立的 ProviderContainer.test()
  2. 02在 ProviderScope 中测试 widget
  3. 03通过 overrides 替换 provider
  4. 04等待异步 provider 的值
  5. 05监听 provider 并模拟 Notifier

适用场景

  1. 01编写不依赖 Flutter 的 Riverpod 单元测试
  2. 02测试依赖 provider 的 widget
  3. 03验证异步 provider 的结果
  4. 04在测试中替换 provider 依赖

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/serverpod/skills-registry --skill riverpod-testing

安装后在 Claude Code 中输入/riverpod-testing确认已加载。

详细介绍

Riverpod — 测试

说明

Riverpod 专为可测试性而设计:按测试隔离状态,通过覆盖项进行模拟,并让测试环境尽可能贴近生产环境。

单元测试(不使用 Flutter)

使用 ProviderContainer.test() 为测试创建容器。不要在多个测试之间共享容器。

void main() {
  test('Some description', () {
    final container = ProviderContainer.test();
    expect(container.read(provider), equals('some value'));
  });
}
  • container.read(provider) — 读取当前值。
  • container.listen(provider, (prev, next) {}) — 监听并获取订阅;使用 subscription.read() 进行读取。对于自动销毁的 provider,优先使用 listen,以免其在测试中途被销毁。
final subscription = container.listen<String>(provider, (_, _) {});
expect(subscription.read(), 'Some value');
Widget 测试

将待测 Widget 包装在 ProviderScope 中:

testWidgets('Some description', (tester) async {
  await tester.pumpWidget(
    const ProviderScope(child: YourWidgetYouWantToTest()),
  );
});

要在测试中与 providers 交互,可通过 tester.container() 获取容器:

final container = tester.container();
expect(container.read(provider), 'some value');
模拟 providers

在 ProviderContainer 或 ProviderScope 上使用 overrides。所有 providers 都可以直接覆盖,无需额外设置。

final container = ProviderContainer.test(
  overrides: [
    exampleProvider.overrideWith((ref) => 'Hello from tests'),
  ],
);

// Or in widget tests:
await tester.pumpWidget(
  ProviderScope(
    overrides: [exampleProvider.overrideWith((ref) => 'Hello from tests')],
    child: const YourWidgetYouWantToTest(),
  ),
);

有关 family 覆盖及其他覆盖方法,请参阅 riverpod-overrides。

等待异步 providers

读取 provider.future,获取一个会在 provider 值就绪后完成的 Future;可与 expectLater 搭配使用:

await expectLater(
  container.read(provider.future),
  completion('some value'),
);
监听 / 监视

使用 container.listen(provider, callback),并断言回调参数,或将值收集到列表中以供断言。支持 mockito/mocktail 的 verify 模式。

模拟 Notifiers

优先模拟 Notifier 所使用的依赖项(例如 repository),而不是模拟 Notifier。如果必须模拟 Notifier,请对其进行子类化(不要实现),使模拟类继承原始基类。使用代码生成时,模拟类通常需要与 Notifier 放在同一文件中,以便访问生成的基类。

更多示例请参阅 riverpod-overrides 和官方文档。

评论

支持 Markdown