Обработка асинхронности с помощью Specflow для Silverlight - PullRequest
12 голосов
/ 02 августа 2010

Тестовая среда Silverlight Unit определяет процесс для работы с асинхронными вызовами (производный класс теста из Microsoft.Silverlight.Testing.SilverlightTest, добавьте атрибут Asynchronous, используйте методы EnqueueXXX.) Учитывая разделение, которое SpecFlow представляет между тестовым классом и шаги:

  • Можно ли использовать эти инструменты для ожидания вызовов методов Silverlight в тесте, которые ведут себя асинхронно (например, при вызовах веб-службы)?
  • Если они не могут, как это сделать в тестовых файлах SpecFlow? (Возможно, использовать AutoResetEvent, который срабатывает в обработчике событий, и ожидать его?)

Ответы [ 3 ]

3 голосов
/ 09 мая 2011

Использование AutoResetEvent не будет работать, потому что вызов WaitOne заблокирует поток пользовательского интерфейса.Silverlight использует поток пользовательского интерфейса даже при выполнении асинхронных вызовов к службам данных (см. Этот пост - Thead заблокирован с помощью WebClient и ManualResetEvent ), поэтому WaitOne фактически остановит вызов службы.

2 голосов
/ 18 января 2012

Я знаю, что, возможно, уже поздно, но здесь идет.

Для асинхронных вызовов silverlight вы можете использовать Specflow AsyncContext api

https://github.com/techtalk/SpecFlow/wiki/Testing-Silverlight-Asynchronous-Code

Я писал об этом в блогекогда он здесь разрабатывался

http://rburnham.wordpress.com/2011/05/13/testing-silverlight-asynchronous-code-with-specflow/

Это помогает объяснить концепцию.

1 голос
/ 16 апреля 2011

Я полагаю, что каждый, кто смотрел и голосовал по этому вопросу, ждал, чтобы кто-то получил удивительный, изящный ответ, но не похоже, что это произойдет здесь.Чтобы помочь другим, которые нуждаются в пригодном для ответа ответе сейчас ...

То, что я сделал с другими ситуациями модульного тестирования, - это использование AutoResetEvent, как вы упомянули в вопросе:

AutoResetEvent MyAutoReset = new AutoResetEvent();
[TestMethod]
public void MyTestMethod()
{
   var MyItem.GetItem(x => 
      {
         // Return handler
         MyAutoReset.Set();
      });
   MyAutoReset.WaitOne(5000, false));
}

Очевидно,Есть несколько вещей, которые следует учитывать при таком подходе, но он дает представление о себе.

...