2013-09-18 4 views
0

У меня возникла проблема с настройкой модульных тестов, которые будут работать с использованием TFS 2012 и .net 4. Из-за ограничений ИТ-пользователей целевых пользователей я не могу построить против 4,5 до тех пор, пока они этого не позволят.Тестирование асинхронных команд [Prism/MEF/Dispatcher/TFS]

Данное приложение представляет собой приложение Prism, состоящее из MEF. Это подключаемое приложение, в котором мы загружаем модули, которые составляют приложение через файл конфигурации. У нас есть определенные модули, которые экспортируют себя в каталог MEF в качестве интерфейса IContent, который предоставляет некоторые базовые функции, которые должны демонстрировать все модули в приложении.

Каждый интерфейс IContent реализует команду делегирования импорта и наблюдаемую коллекцию ошибок в модуле. Сбор ошибок связан с пользовательским интерфейсом, поэтому он должен обновляться в потоке пользовательского интерфейса.

Я создал тестовый класс, который создает и запускает загрузчик MEF и загружает все модули в приложении в ClassInitialize тестового класса. Затем тестовый класс может использовать каталог MEF для получения всех экземпляров IContent и запускать те же тесты базового блока для каждого модуля, чтобы обеспечить их пропуск. Когда к нашему решению/приложению добавляются новые модули, они автоматически подбираются и проверяются с помощью одних и тех же модульных тестов.

Для удобства примера команда IContent имеет команду делегирования импорта как часть ее интерфейса. Команда выполняется в фоновом потоке, который будет загружать некоторые данные, добавляя некоторые ошибки в коллекцию ошибок. Поскольку сбор ошибок связан с пользовательским интерфейсом, обновления выполняются с помощью checkaccess и begininvoke по мере необходимости, чтобы обеспечить сбор ошибок в правильном потоке. В конце всего модуля модуль отправит агрегированное событие, чтобы указать оболочке, что модуль выполнил свою работу.

Все работает нормально при работе в контексте приложения WPF. При выполнении модульных тестов коллекции ошибок никогда не обновляются. Я считаю, что причина в том, что основной поток, на котором работает загрузочная лента, создает наблюдаемые коллекции - и поскольку в этом потоке всегда выполняется единичный тест, его диспетчер никогда не будет обрабатывать дополнения к коллекции ошибок, поэтому тест не удастся. Я проверил это, как если бы я изменил CheckAccess/BeginInvoke, чтобы просто запускать его в строке, он будет зависать в invoke для обновления коллекции ошибок. Похоже, что выполнение единичного теста всегда блокирует основной поток.

Итак, чтобы подвести итог: Есть ли способ настроить загрузочную ленту так, чтобы она выполнялась и обрабатывалась в потоке, отличном от основного потока диспетчера TFS? Могу ли я запустить основной поток, обработать метод тестирования в фоновом потоке, ответить на необходимые события, на которые диспетчер должен отвечать, а затем завершить мои модульные тесты?

Заранее благодарим за любую помощь.

ответ

0

Итак, попробовав что-то новое, ключ в том, как bootstrapper создает оболочку. Я объявлял, что моя оболочка в тестовых классах основана на объекте Dependancy, а не на wpf-окне. изменение этого окна wpf заставило все работать. Теперь нет необходимости определять, какие из них выполняются в потоке. После этого он просто работает.

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