web-dev-qa-db-ja.com

Dartプログラムを「スリープ」する方法

テストのために、Dartアプリケーションで非同期Webサービス呼び出しをシミュレートするのが好きです。これらのモックコールのランダムな応答をシミュレートするために(おそらく順不同)モックをプログラムして、「Future」を返す前に一定時間待機(スリープ)するようにします。

これどうやってするの?

59
Vinnie

Future.delayedファクトリを使用して、遅れて未来を完成させることもできます。以下は、遅延後に文字列を非同期的に返す2つの関数の例です。

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");
}
69
Shailen Tuli

常に望むものとは限りません(場合によっては_Future.delayed_が必要です)が、Dartコマンドラインアプリで本当にスリープしたい場合は、Dart:ioのsleep()を使用できます。

_import 'Dart:io';

main() {
  sleep(const Duration(seconds:1));
}
_
37
Seth Ladd

コードの実行を遅延させるために、Dartにはいくつかの実装があることがわかりました。

new Future.delayed(const Duration(seconds: 1)); //recommend

new Timer(const Duration(seconds: 1), ()=>print("1 second later."));

sleep(const Duration(seconds: 1)); //import 'Dart:io';

new Stream.periodic(const Duration(seconds: 1), (_) => print("1 second later.")).first.then((_)=>print("Also 1 second later."));
//new Stream.periodic(const Duration(seconds: 1)).first.then((_)=>print("Also 1 second later."));
15
SpkingR

非同期関数のコンテキストでの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);
} 
10
Bono Lv

これは、エラーを模擬するオプションのパラメーターをとることができる便利な模擬です:

  Future _mockService([dynamic error]) {
    return new Future.delayed(const Duration(seconds: 2), () {
      if (error != null) {
        throw error;
      }
    });
  }

次のように使用できます。

  await _mockService(new Exception('network error'));
2

また、単体テスト中にサービスが完了するまで待つ必要がありました。私はこの方法を実装しました:

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) {
                ...
            } );
    }
}
0
Luciano