我怎样才能“睡”Dart程序

时间:2013-08-26 17:42:25

标签: unit-testing mocking dart

我喜欢在Dart应用程序中模拟异步Web服务调用以进行测试。为了模拟这些模拟调用的随机性响应(可能是乱序),我想编程我的模拟等待(睡眠)一段时间后再返回'Future'。

我该怎么做?

8 个答案:

答案 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));