Как я могу сделать тест внутри оператора then в Dart

Я хочу выполнить несколько модульных тестов для некоторых функций, но мне нужно выполнить все тесты после завершения Future.

Чтобы развить мою проблему, вот пример того, что я хочу сделать:

registerToServer(contentOfRequest).then((id){
  test('test function1', () {
    function1(id, contentOfRequest).then(expectAsync((val){
       expect(val, whatIExpect);
    }));
  });
  test('test function2', () {
    function2(id, contentOfRequest).then(expectAsync((val){
       expect(val, whatIExpect);
    }));
  }):
  ...
};

Я пробовал альтернативное решение, но это ничего не меняет:

String id;
registerToServer(contentOfRequest).then((sid){
  id = sid;
}).then((_){
  test('test function1', () {
    function1(id, contentOfRequest).then(expectAsync((val){
       expect(val, whatIExpect);
    }));
  });
  test('test function2', () {
    function2(id, contentOfRequest).then(expectAsync((val){
       expect(val, whatIExpect);
    }));
  }):
  ...
};

И я бы по возможности тесты организовал как то, так как хочу описание для всех тестов.

Трассировка стека примерно такая:

Unhandled exception:
Uncaught Error: Bad state: Not allowed when tests are running.
Stack Trace:
#0      _requireNotRunning (package:unittest/unittest.dart:430:3)
#1      test (package:unittest/unittest.dart:100:21)
#2      main.<anonymous closure> (file:///.../server_test.dart:260:11)
#3      _RootZone.runUnary (dart:async/zone.dart:1155)
#4      _Future._propagateToListeners.handleValueCallback (dart:async/future_impl.dart:484)
#5      _Future._propagateToListeners (dart:async/future_impl.dart:567)
#6      _Future._completeWithValue (dart:async/future_impl.dart:358)
#7      _Future._asyncComplete.<anonymous closure> (dart:async/future_impl.dart:412)
#8      _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41)
#9      _asyncRunCallback (dart:async/schedule_microtask.dart:48)
#10     _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:84)
#11     _startIsolate (dart:isolate-patch/isolate_patch.dart:244)
#12     _startMainIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:192)
#13     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:130)

#0      _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:886)
#1      _asyncRunCallbackLoop (dart:async/schedule_microtask.dart:41)
#2      _asyncRunCallback (dart:async/schedule_microtask.dart:48)
#3      _runPendingImmediateCallback (dart:isolate-patch/isolate_patch.dart:84)
#4      _startIsolate (dart:isolate-patch/isolate_patch.dart:244)
#5      _startMainIsolate.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:192)
#6      _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:130)

person antonin.lebrard    schedule 17.03.2015    source источник


Ответы (1)


Я предполагаю, что не поддерживается перенос тестов в другие функции, как вы сделали здесь

registerToServer(contentOfRequest).then((id){

тест('тестовая функция1', () {

Вы можете использовать setUp() для подготовки к тесту

main() {
  group('xxx', () {
    setUp(() {
      return registerToServer(contentOfRequest);
    });

    test('some', () {
      return function1(id, contentOfRequest).then((val){
       expect(val, whatIExpect);
      }));
    });
  });
}

Недостатком является то, что в настоящее время нет возможности выполнить настройку для группы тестов. setUp() и tearDown() вызываются до/после каждого отдельного теста. Добавьте комментарий (+1 или аналогичный) на https://github.com/dart-lang/unittest/issues/18

При использовании асинхронных вызовов в setUp/tearDown/test всегда возвращайте будущее. Платформа тестирования распознает, когда будущее возвращается, и ждет, пока будущее не завершится, прежде чем оно закончится. Таким образом, вам не придется иметь дело с expectAsync или подобными инструментами.

person Günter Zöchbauer    schedule 17.03.2015
comment
Это работает, это не идеальное решение, но оно работает. Я опубликую комментарий с моим случаем, чтобы поддержать решение этой проблемы. Спасибо еще раз! - person antonin.lebrard; 17.03.2015