Мне нравится моделировать вызов асинхронного веб-сервиса в моем приложении Dart для тестирования. Чтобы смоделировать случайность ответов этих ложных вызовов (возможно, не по порядку), я хотел бы запрограммировать мои макеты на ожидание (сон) в течение определенного периода времени, прежде чем возвращать «Будущее».
Как я могу это сделать?
unit-testing
mocking
dart
Винни
источник
источник
() => "1"
?await sleep1();
Это не всегда то, что вы хотите (иногда вы хотите
Future.delayed
), но если вы действительно хотите спать в своем приложении командной строки Dart, вы можете использовать dart: io'ssleep()
:import 'dart:io'; main() { sleep(const Duration(seconds:1)); }
источник
await sleep()
и делал, и ожидаю, что другие задания будут выполняться во время сна :(Издание 2019 г .:
В асинхронном коде
await Future.delayed(Duration(seconds: 1));
В коде синхронизации
import 'dart:io'; sleep(Duration(seconds:1));
Примечание. Это блокирует весь процесс (изолирует), поэтому другие асинхронные функции обрабатываться не будут. Он также недоступен в Интернете, потому что Javascript действительно только асинхронный.
источник
sleep()
полностью блокирует весь изолят. Во время сна код Dart не запускается. Вероятно, он компилируется во что-то вроде C ++std::this_thread::sleep_for
.Future.delayed()
планирует возобновление асинхронной функции позже, но затем возвращает управление циклу событий Dart, чтобы другие асинхронные функции могли продолжать работу.Я обнаружил, что в 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."));
источник
Для синтаксиса 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); }
источник
Это полезный макет, который может принимать необязательный параметр для имитации ошибки:
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) { ... } ); } }
источник