как проводить модульное тестирование сильно асинхронных процессов в дротике?

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

void expectAsyncWithReadyCheckAndTimeout(bool readyCheck(), int timeout, void expect()){
  DateTime start = new DateTime.now();
  Duration limit = new Duration(seconds: timeout);
  var inner;
  inner = (){
    if(readyCheck()){
      expect();
    }else if(new DateTime.now().subtract(limit).isAfter(start)){
      throw 'async test timed out';
    }else{
      Timer.run(expectAsync(inner));
    }
  };
  inner();
}

это в основном продолжает работать до тех пор, пока тест не будет готов к запуску или пока не истечет указанный тайм-аут, есть ли способ добиться этого или чего-то подобного непосредственно с библиотекой dart unittest?


person Daniel Robinson    schedule 26.04.2014    source источник


Ответы (2)


Что я обычно делаю, так это создаю единственную «готовую» функцию с expectAsync, а затем вызываю эту функцию, когда сложный тест завершен.

testFoo() { 
  var done = expectAsync((){});
  someComplexTest(....
     ...
     if (eveerythingOk) done();
     ..
  )
}

То есть: заранее создайте обернутую функцию expectAsync и вызывайте ее, когда вы считаете, что тест завершен успешно, а все остальное обрабатывайте вручную.

person lrn    schedule 27.04.2014

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

person Günter Zöchbauer    schedule 26.04.2014
comment
разве этот аргумент просто не говорит ему, что его нужно вызывать N раз? Я не понимаю, почему кто-то захочет это сделать, я просто хочу, чтобы мой асинхронный тест запускался один раз, когда все остальные мои асинхронные процессы завершены и тест готов, но я не знаю, сколько асинхронных процессов нужно завершить, прежде чем тест будет завершен. готовы, обычно это может быть где-то между 1 и 20. - person Daniel Robinson; 27.04.2014
comment
Это было так. Кажется, я не понял вашего вопроса. - person Günter Zöchbauer; 27.04.2014
comment
ну, скажем, я позвоню expectAsync((){/*expectStuff*/}, count: 4), не будет ли это expectStuff 4 раза? и если мои асинхронные процессы еще не завершились все 4 раза, это expectsStuff произойдет сбой, не так ли? или если это только expectsStuff при последнем выполнении, я не знаю, что мой тест охватывает 4 асинхронных процесса, это может быть любое количество асинхронных процессов, связанных вместе, поэтому снова тест завершится ошибкой, если он ожидает 5 или более вызовов асинхронной цепочки не так ли? - person Daniel Robinson; 27.04.2014
comment
Можете ли вы создать один expectAsync для каждого асинхронного процесса при их создании? - person Günter Zöchbauer; 27.04.2014
comment
ну, я в основном создаю полные сквозные тесты для полного веб-стека, тест начинается с вызова метода в представлении, которое затем асинхронно обращается к серверу, который затем может выполнять любое количество асинхронных вызовов к службам и базам данных. и т. д., прежде чем, наконец, вернуть ответ на представление и обновить себя. expectAsyncWithReadyCheckAndTimeout удовлетворяет мои потребности, потому что он будет оценивать после завершения любого количества асинхронных процессов при условии, что он находится в пределах ограничения времени ожидания, которое существует только в качестве меры предосторожности, поэтому тесты не могут выполняться вечно. Я просто надеялся, что может быть встроенный - person Daniel Robinson; 27.04.2014
comment
метод для достижения того же эффекта или альтернативный подход, о котором я не думал, ваше предложение expectAsync после запуска каждого асинхронного процесса является хорошей идеей, но не открыто для меня, поскольку тест имеет доступ только к представлению и должен ждать завершения представление для обновления себя после ответа веб-серверов - person Daniel Robinson; 27.04.2014