Обработка асинхронности с помощью Specflow для Silverlight

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

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

person John Garland    schedule 02.08.2010    source источник


Ответы (3)


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

person David Fevre    schedule 09.05.2011

Я знаю, что это, вероятно, слишком поздно, но начнем.

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

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

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

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

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

person Ryan Burnham    schedule 17.01.2012

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

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

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

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

person JasonRShaver    schedule 15.04.2011
comment
Спасибо за обновление, Джейсон. Очевидно, с тех пор, как это было изначально опубликовано, прошло некоторое время. Я буду счастлив отметить это как ответ, когда у меня будет время применить этот код к тесту, созданному SpecFlow. Кроме того, мне интересно, поможет ли новый Async CTP что-нибудь решить эту проблему. - person John Garland; 18.04.2011