2013-11-13 3 views
2

Я действительно не понимаю цели защиты методов AsyncN.Как защищаетAsyncN в пакете Dart unittest?

Может кто-нибудь объяснить мне, как он должен работать? Например, представьте себе следующий тестовый пример:

import "package:unittest/unittest.dart"; 
import "dart:async"; 

void main() { 
    test("Protect async",() { 
    // given 
    var controller = new StreamController(); 

    // when 
    controller.add("This is correct!"); 

    // then 
    controller.stream.listen(protectAsync1((event) { 
     expect(event, equals("This is correct!")); 
    })); 
    }); 
} 

Что должно быть поведение? Я бы ожидать, что это тест пройти, однако я получаю следующее сообщение:

unittest-suite-wait-for-done 
ERROR: Protect async 
    Callback called (1) after test case Protect async has already been marked as pass. 

0 PASSED, 0 FAILED, 1 ERRORS 
Unhandled exception: 
Exception: Some tests failed. 
#0  SimpleConfiguration.onDone (package:unittest/src/simple_configuration.dart:213:9) 
#1  _completeTests (package:unittest/unittest.dart:779:17) 
#2  _runTest (package:unittest/unittest.dart:734:19) 
#3  _nextTestCase (package:unittest/unittest.dart:641:11) 
#4  _asyncRunCallback (dart:async/schedule_microtask.dart:18) 
#5  _asyncRunCallback (dart:async/schedule_microtask.dart:21) 
#6  _createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:11) 
#7  _Timer._createTimerHandler._handleTimeout (timer_impl.dart:151) 
#8  _Timer._createTimerHandler._handleTimeout (timer_impl.dart:159) 
#9  _Timer._createTimerHandler._handleTimeout (timer_impl.dart:159) 
#10  _Timer._createTimerHandler.<anonymous closure> (timer_impl.dart:166) 
#11  _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:93) 

Я попытался с помощью guardAsync и она работает, как ожидалось. Однако, я действительно не понимаю protectAsync.

Может ли кто-нибудь объяснить мне цель и правильное использование этого? Большое спасибо!

ответ

0

В these docs это описывается как

оборачивает обратного вызова в новой функции и возвращает эту функцию. Новая функция сможет обрабатывать исключения, направляя их на правильный тест. Таким образом, это похоже на ожидание Async0. Используйте его, чтобы обернуть любые обратные вызовы, которые могут быть вызваны, но никогда не могут быть вызваны во время теста. callback должен принимать 0 позиционных аргументов (именованные аргументы не поддерживаются). id может использоваться для идентификации обратного вызова в сообщениях об ошибках (например, если он вызывается после завершения тестового примера).

Так, предположительно это сантехнический, чтобы тест рамки для испытаний асинхронных лучше ручек (вы не хотите, чтобы ваш тест немедленно завершен, а затем некоторая асинхронная работа вы стартовали бросает исключение, но не обязательно ваш тест, потому что он уже был завершен).

Я не уверен, почему тест будет терпеть неудачу; что может показаться неправильным:/

Смежные вопросы