关于 riverpod-testing
这项 Riverpod skill 介绍 Dart 中有无 Flutter 时的 provider 测试方式,面向编写单元测试和 widget 测试的开发者。内容涵盖隔离容器、覆盖、异步 provider、监听及 Notifier 模拟。
主要功能
- 01为每项测试创建独立的 ProviderContainer.test()
- 02在 ProviderScope 中测试 widget
- 03通过 overrides 替换 provider
- 04等待异步 provider 的值
- 05监听 provider 并模拟 Notifier
适用场景
- 01编写不依赖 Flutter 的 Riverpod 单元测试
- 02测试依赖 provider 的 widget
- 03验证异步 provider 的结果
- 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 和官方文档。