【发布时间】:2014-02-11 10:20:17
【问题描述】:
我有这样的简单课程
abstract class ServerConnection {
Stream onMessage;
Future send(Message m);
...
}
您使用消息调用发送,异步响应将流式传输到 onMessage。现在我需要通过这个连接发送各种消息和测试响应。我做了这个测试,但它不工作(我迷失了这些 expectAsynces)和 _waitForNextEvent 不是很好(但至少工作!)
test('connection', () {
getCon().then((ServerConnection c) {
Future<Message> _waitForNextEvent(Stream s) {
StreamSubscription ss;
Completer c = new Completer();
ss = s.listen((Message m) {
ss.cancel();
c.complete(m);
});
return c.future;
}
_waitForNextEvent(c.onMessage).then(expectAsync1(
(m) => expect(m, new isInstanceOf<OkMessage>('OkMessage'))
));
c.send(new StatusMessage());
_waitForNextEvent(c.onMessage).then(expectAsync1(
(m) => expect(m, new isInstanceOf<PongMessage>('PongMessage'))
));
c.send(new PingMessage());
});
});
那么测试 Dart Streams 的正确和优雅的方法是什么?
【问题讨论】:
-
看看引用的问题。如果它没有帮助添加评论。您需要注册一个您希望使用
expectAsyncX()调用的方法在开始任何异步操作之前。 -
在最新的单元测试包 (0.10.0) 中,不推荐使用 expectAsync0/1/2 Changelog - unittest 0.10.0。似乎 0.10.0 有一个错误 Unittest 0.10.0 expectAsync Failure and other problems(只是为了让您知道,因为您可能会遇到它)。
-
我猜这个测试总是会中断,因为两个消息都会触发两个回调,例如发送
PingMessage并且测试将中断,因为假设PingMessage不是子类OkMessage,第一个回调期待OkMessage。我想安全的方法是为每条不同的消息创建一个新流,但我可能错了。
标签: unit-testing dart dart-async