ОБНОВЛЕНИЕ:
Я уже остановился на использовании StatLight для своего сервера непрерывной интеграции, но я искал решение, позволяющее мне запускать асинхронные модульные тесты Silverlight непосредственно в VS2010 во время разработки.
Вдохновленный предложением Роба Фонсека-Энсора использовать Rx (см. Его отдельный ответ на этой странице), я еще раз взглянул на проблему.Это привело меня к поиску не-Rx решения проблемы использования AgUnit для запуска асинхронных модульных тестов Silverlight.
Решение, которое, я думаю, я буду использовать - по крайней мере, на данный момент, - это сочетание:
- Платформа модульного тестирования Silverlight
- ReSharper 5.1
- Плагин AgUnit ReSharper
- [Образец асинхронной модели]
Мои модели просмотра имеютсделанные на их основе классы обслуживания, которые предоставляют абстракции моих (автоматически сгенерированных) справочных классов услуг WCF.Чтобы обеспечить доступ к методам службы WCF, мои классы обслуживания на заказ также полагаются на другой общий класс, который обертывает асинхронный шаблон.Для своих модульных тестов я уже издевался над моими справочными классами службы WCF и моими классами обслуживания на заказ с помощью Moq - но я не смотрел на насмешку над моим классом-оболочкой асинхронного шаблона.
Поэтому я решил смоделировать свой асинхронный шаблонкласс обертки также.Привлекательность этого заключалась в том, что я думал, что я мог бы тогда быть в состоянии использовать Rx с фиктивным IScheduler (как Роб предложил в своем ответе) во всех моих издевательствах, оставляя мои настоящие классы свободными от любых ссылок наRx (что является обязательным требованием, потому что для этого проекта в том месте, где я работаю, мне нужно исключить Rx из любого кода, который развертывается в производственной среде).Однако, как только я высмеял класс-обертку, я понял, что мне даже не нужен Rx, и что существует еще более простое решение, которое я действительно должен был рассмотреть раньше.Это довольно тривиально - все, что мне действительно нужно было сделать, - это смоделировать класс-оболочку и убедиться, что он вызывает Invoke для операций обратного вызова, а не вызывать BeginInvoke.Это в конечном итоге предотвращает попадание обратных вызовов, которые прекрасно работают при работе с модулем модульного тестирования Silverlight в сеансе браузера, когда модульные тесты запускаются AgUnit в VS2010.(Разрешение обратным вызовам перейти в черную дыру при использовании AgUnit, конечно, помешало бы правильному завершению отдельных тестов и могло привести к тайм-аутам или, что еще хуже, к ложным срабатываниям в результатах тестов.)
В отсутствие более качественных советов по любым последующим ответам на этот вопрос мне представляется, что это самый простой способ справиться с этим сценарием - позволить моим асинхронным модульным тестам запускаться в AgUnit, не требуя Rx в моем производственном коде.
Для тех, кто не сталкивается с наложенными компанией ограничениями на развертывание кода, использующего Rx (который по-прежнему является проектом DevLabs), я думаю, что решение Роба определенно стоит посмотреть.