【发布时间】:2022-01-23 20:11:09
【问题描述】:
我是 Riverpod 的新手,我正在关注有关提供程序组合的文档。
在组合提供程序并在 dart 测试(在 test_widgets 之外)中测试输出时,我遇到了我不理解的行为。 我试图用一个简单的代码来概述它,如下所示:
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:riverpod/riverpod.dart';
final positiveProvider = StateProvider<int>((ref) => 0);
final negativeProvider = StateProvider<int>((ref) => 0);
final combinedProvider = Provider<int>((ref) {
final positive = ref.watch(positiveProvider);
final negative = ref.watch(negativeProvider);
print('Counter state: ${positive - negative}');
return positive - negative;
});
class CounterListener extends Mock {
void call(int? previous, int value);
}
void main() {
test('Test riverpod provider combination', () {
final container = ProviderContainer();
addTearDown(container.dispose);
final counterListener = CounterListener();
container.listen(combinedProvider, counterListener, fireImmediately: true);
verify(counterListener.call(null, 0)).called(1);
container.read(positiveProvider.state).state = 1;
verify(counterListener.call(0, 1)).called(1);
});
}
我得到了这个结果:
Counter state: 0 No matching calls. All calls: [VERIFIED] CounterListener.call(null, 0) (If you called `verify(...).called(0);`, please instead use `verifyNever(...);`.) package:test_api fail
_VerifyCall._checkWith
_makeVerify.<fn> main.<fn>
✖ Test riverpod provider combination Exited (1)
行为是组合的提供者不会自动触发其内部函数,我认为它会这样做。
我不确定我是否误解了组合提供程序所需的编码模式,或者它是否来自测试中的容器逻辑,不是“观察”而是“听”。
感谢您的帮助,
【问题讨论】: