テストのために、Dartアプリケーションで非同期Webサービス呼び出しをシミュレートするのが好きです。応答するこれらのモックコールのランダム性をシミュレートするために(おそらく順序が狂っています)、「Future」を返す前に一定時間待機(スリープ)するようにモックをプログラムしたいと思います。
これどうやってするの?
回答:
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");
}
await sleep1();
2019年版:
await Future.delayed(Duration(seconds: 1));
import 'dart:io';
sleep(Duration(seconds:1));
注:これはプロセス全体をブロック(分離)するため、他の非同期関数は処理されません。Javascriptは実際には非同期のみであるため、Webでも利用できません。
sleep()
分離株全体を完全にブロックします。スリープ中は、Dartコードはまったく実行されません。おそらくC ++のようなものにコンパイルされますstd::this_thread::sleep_for
。Future.delayed()
非同期関数を後で再開するようにスケジュールしますが、その後、他の非同期関数を実行し続けることができるように、Dartイベントループに制御を戻します。
必ずしも必要なものではありませんが(場合によっては必要な場合もありますFuture.delayed
)、Dartコマンドラインアプリで本当にスリープしたい場合は、dart:ioのsleep()
:を使用できます。
import 'dart:io';
main() {
sleep(const Duration(seconds:1));
}
await sleep()
あり、睡眠中に他の仕事が実行されることを期待しています:(
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."));
これは、オプションのパラメータを使用してエラーをモックできる便利なモックです。
Future _mockService([dynamic error]) {
return new Future.delayed(const Duration(seconds: 2), () {
if (error != null) {
throw error;
}
});
}
次のように使用できます。
await _mockService(new Exception('network error'));
また、単体テスト中にサービスが完了するのを待つ必要がありました。私はこのように実装しました:
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) {
...
} );
}
}
() => "1"
何ですか?