我喜欢在Dart应用程序中模拟异步Web服务调用以进行测试。为了模拟这些模拟调用的随机性响应(可能是乱序),我想编程我的模拟等待(睡眠)一段时间后再返回'Future'。
我该怎么做?
答案 0 :(得分:57)
您还可以使用Future.delayed工厂在延迟后完成未来。以下是两个在延迟后异步返回字符串的函数的示例:
import 'dart:async';
Future sleep1() {
return new Future.delayed(const Duration(seconds: 1), () => "1");
}
Future sleep2() {
return new Future.delayed(const Duration(seconds: 2), () => "2");
}
答案 1 :(得分:32)
并不总是你想要的(有时你想要Future.delayed
),但是如果你真的想睡在你的Dart命令行应用程序中,你可以使用dart:io的sleep()
:
import 'dart:io';
main() {
sleep(const Duration(seconds:1));
}
答案 2 :(得分:9)
我发现Dart中有几个实现代码延迟执行:
Tombstone_warn_threshold
Tombstone_failure_threshold
答案 3 :(得分:5)
2019年版:
await Future.delayed(Duration(seconds: 1));
import 'dart:io';
sleep(Duration(seconds:1));
注意:这会阻止整个过程(隔离),因此不会处理其他异步功能。由于Javascript实际上仅是异步的,因此它在网络上也不可用。
答案 4 :(得分:3)
对于Dart 2+语法,在异步函数上下文中:
import 'package:meta/meta.dart'; //for @required annotation
void main() async {
void justWait({@required int numberOfSeconds}) async {
await Future.delayed(Duration(seconds: numberOfSeconds));
}
await justWait(numberOfSeconds: 5);
}
答案 5 :(得分:2)
这是一个有用的模拟,可以采用可选参数模拟错误:
Future _mockService([dynamic error]) {
return new Future.delayed(const Duration(seconds: 2), () {
if (error != null) {
throw error;
}
});
}
您可以像这样使用它:
await _mockService(new Exception('network error'));
答案 6 :(得分:0)
我还需要在单元测试期间等待服务完成。我是这样实现的:
void main()
{
test('Send packages using isolate', () async {
await SendingService().execute();
});
// Loop to the amount of time the service will take to complete
for( int seconds = 0; seconds < 10; seconds++ ) {
test('Waiting 1 second...', () {
sleep(const Duration(seconds:1));
} );
}
}
...
class SendingService {
Isolate _isolate;
Future execute() async {
...
final MyMessage msg = new MyMessage(...);
...
Isolate.spawn(_send, msg)
.then<Null>((Isolate isolate) => _isolate = isolate);
}
static void _send(MyMessage msg) {
final IMyApi api = new IMyApi();
api.send(msg.data)
.then((ignored) {
...
})
.catchError((e) {
...
} );
}
}
答案 7 :(得分:0)
睡眠同步:
sleep(Duration(seconds: 15));
异步睡眠:
await Future.delayed(Duration(seconds: 10));