[unit-testing] Dart 프로그램을 “수면”하려면 어떻게해야합니까?

테스트를 위해 Dart 애플리케이션에서 비동기 웹 서비스 호출을 시뮬레이션하고 싶습니다. 응답하는 모의 호출의 무작위성을 시뮬레이션하기 위해 (아마도 순서가 맞지 않음) ‘미래’를 반환하기 전에 일정 시간 동안 대기 (수면)하도록 내 모의를 프로그래밍하고 싶습니다.

어떻게 할 수 있습니까?



답변

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


답변

항상 원하는 것은 아니지만 (때로는 원하는 경우도 있음 Future.delayed) Dart 명령 줄 앱에서 잠을 자고 싶다면 dart : io ‘s를 사용할 수 있습니다 sleep().

import 'dart:io';

main() {
  sleep(const Duration(seconds:1));
}


답변

2019 년 판 :

비동기 코드에서

await Future.delayed(Duration(seconds: 1));

동기화 코드에서

import 'dart:io';

sleep(Duration(seconds:1));

참고 : 이렇게하면 전체 프로세스 (격리)가 차단되므로 다른 비동기 함수는 처리되지 않습니다. Javascript는 실제로 비동기 전용이기 때문에 웹에서도 사용할 수 없습니다.


답변

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