J'aime simuler un appel de service Web asynchrone dans mon application Dart à des fins de test. Pour simuler le caractère aléatoire de la réponse de ces faux appels (peut-être dans le désordre), j'aimerais programmer mes simulacres pour attendre (dormir) pendant un certain temps avant de renvoyer le «futur».
Comment puis-je faire ceci?
unit-testing
mocking
dart
Vinnie
la source
la source
() => "1"
?Ce n'est pas toujours ce que vous voulez (parfois vous voulez
Future.delayed
), mais si vous voulez vraiment dormir dans votre application de ligne de commande Dart, vous pouvez utiliser dart: io'ssleep()
:import 'dart:io'; main() { sleep(const Duration(seconds:1)); }
la source
await sleep()
et je m'attends à ce que les autres travaux s'exécutent pendant le sommeil :(Édition 2019:
Dans le code asynchrone
await Future.delayed(Duration(seconds: 1));
Code de synchronisation
import 'dart:io'; sleep(Duration(seconds:1));
Remarque: Cela bloque l'ensemble du processus (isoler), de sorte que les autres fonctions asynchrones ne seront pas traitées. Il n'est pas non plus disponible sur le Web car Javascript est vraiment uniquement asynchrone.
la source
sleep()
bloque complètement l'isolat entier. Aucun code Dart ne s'exécutera pendant qu'il est en veille. Il compile probablement à quelque chose comme C ++std::this_thread::sleep_for
.Future.delayed()
planifie la reprise ultérieure de la fonction asynchrone, mais elle retourne ensuite le contrôle de la boucle d'événements Dart afin que d'autres fonctions async puissent continuer à s'exécuter.J'ai trouvé qu'il existe plusieurs implémentations dans Dart pour retarder l'exécution du code:
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."));
la source
Pour la syntaxe Dart 2+, dans un contexte de fonction asynchrone:
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); }
la source
C'est une simulation utile qui peut prendre un paramètre facultatif pour simuler une erreur:
Future _mockService([dynamic error]) { return new Future.delayed(const Duration(seconds: 2), () { if (error != null) { throw error; } }); }
Vous pouvez l'utiliser comme ceci:
await _mockService(new Exception('network error'));
la source
J'avais également besoin d'attendre la fin d'un service lors d'un test unitaire. J'ai implémenté de cette façon:
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) { ... } ); } }
la source