【发布时间】:2020-11-25 03:40:24
【问题描述】:
一个简单的用例,我从服务器中获取数据列表。 我想将其转换为流。在此之前,我想在单元测试中测试事情是否正常。
环境
- Flutter(通道稳定,1.22.4,在 Linux 上)
- Dart SDK 版本:2.10.4(稳定)
以下是合并在一个文件中的简化代码。
import 'package:flutter_test/flutter_test.dart';
class BeanList<T> {
final List<T> list;
final int count;
BeanList({this.list, this.count});
}
abstract class PageProvider<T> {
Future<BeanList<T>> provide();
}
class IntPageProvider implements PageProvider<int> {
final size = 5;
final count = 9;
int offset = 0;
List<int> _generateList(int startFrom, int size) {
List<int> list = [];
for (int i = startFrom; i < startFrom + size; i++) {
list.add(i);
}
return list;
}
@override
Future<BeanList<int>> provide() async {
final list = _generateList(offset, size);
print('provide: $list');
offset += size;
return BeanList<int>(list: list, count: count);
}
}
Stream<T> itemStream<T>(PageProvider<T> provider) async* {
int total;
int sent = 0;
bool done = false;
while (true) {
final BeanList<T> beanList = await provider.provide();
final list = beanList.list;
final count = beanList.count;
total = beanList.count;
print('Got count:$count, list:$list');
for (final item in list) {
print('yield $item');
yield item;
sent++;
done = sent == total;
if (done) break;
}
if (done) break;
}
}
void main() {
test('Randomly breaking stream', () {
itemStream(IntPageProvider()).listen(print);
});
}
预期的输出我应该得到数字 0 到 8,我有时会这样做,但大多数时候测试会在任何随机位置停止。
【问题讨论】:
-
我无法在纯飞镖环境和颤振测试中重现这一点。两者都有预期的结果。
-
添加环境信息,如果无论如何它与环境有关。
-
仅供参考,您可以在一个
break语句中使用带标签的 break 来打破两个循环:outerLoop: while (true) { .... for (...) ... if (sent == total) break outerLoop; } }。那么你就不需要done变量和额外的if和break。
标签: dart stream flutter-test