【发布时间】:2018-08-10 00:29:41
【问题描述】:
我正在尝试在 Dart 中创建一个列表,该列表在每次添加或删除对象时发送事件,但我无法弄清楚如何为其编写单元测试。
这是列表的代码:
enum Action { Insert, Modify, Remove }
class ListChangeEvent {
final int index;
final Action action;
final PathComponent component;
ListChangeEvent(this.index, this.action, this.component);
}
class PathComponentList extends DelegatingList<PathComponent> {
final List<PathComponent> _list = [];
@override
List<PathComponent> get delegate => _list;
var changeController = new StreamController<ListChangeEvent>();
Stream<ListChangeEvent> get onChange => changeController.stream;
@override
void add(PathComponent value) {
super.add(value);
changeController
.add(new ListChangeEvent(this.indexOf(value), Action.Insert, value));
}
}
现在我想做的是创建一个单元测试来验证每次我插入一个元素时,我都会在流中得到一个 ListChangeEvent。
这是我目前的尝试。这会永远挂起,我敢肯定,因为我从不关闭流。
void main() {
group('PathComponentList', () {
PathComponentList list = PathComponentList();
var body = PathComponent(Path.Body);
var chance = PathComponent(Path.Chance);
var crossroads = PathComponent(Path.Crossroads);
setUp(() async {
list = PathComponentList();
});
test('should fire event when adding', () async {
list.add(body);
list.add(chance);
list.add(crossroads);
List<ListChangeEvent> events = await list.onChange.toList();
expect(events[0].action, equals(Action.Insert));
expect(events[0].index, equals(0));
expect(events[0].component, equals(body));
});
});
}
我尝试从流中获取单个元素,如下所示:
await list.onChange.elementAt(index);
但如果我不止一次这样做,代码会抱怨我已经收听了流。
由于我希望流在应用程序的生命周期内发送 ListChangeEvents,那么在我的单元测试中读取写入此流的三个 ListChangeEvent 的最佳方法是什么?
【问题讨论】:
-
尼特:不要在这一行分配
listPathComponentList list = PathComponentList();- 让它为空! -
是的,我最终会看到的。代码开始时没有 setup() 方法;我重构时忘记解决这个问题。谢谢!
标签: unit-testing async-await dart