Я написал класс C#, который находится между пользовательским интерфейсом приложения WPF и системой обмена сообщениями Async. Теперь я пишу Unit Tests для этого класса и сталкиваюсь с проблемами с диспетчером. Следующий метод относится к тестируемому классу, и он создает обработчик подписки. Таким образом, я вызываю этот метод Set_Listing_Records_ResponseHandler
из Тестирования единиц измерения.Модульное тестирование класса, используемого в многопоточном приложении WPF
public async Task<bool> Set_Listing_Records_ResponseHandler(
string responseChannelSuffix,
Action<List<AIDataSetListItem>> successHandler,
Action<Exception> errorHandler)
{
// Subscribe to Query Response Channel and Wire up Handler for Query Response
await this.ConnectAsync();
return await this.SubscribeTo_QueryResponseChannelAsync(responseChannelSuffix, new FayeMessageHandler(delegate (FayeClient client, FayeMessage message) {
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
try
{
...
}
catch (Exception e)
{
...
}
}));
}));
}
поток выполнения возвращается к .... линии Application.Current.Dispatcher но потом выкидывает ошибку:
Object reference not set to an instance of an object.
Когда я отладки я могу видеть, что Application.Current
равна нулю.
Я проделал несколько поисков и нашел несколько примеров использования диспетчера в модуле Test Test Method, и я попытался выполнить некоторые из них, и они предотвращают ошибку, но код в диспетчере никогда не запускается ,
Я не смог найти примеров, когда есть диспетчер, используемый в методе, который вызывает метод тестирования.
Я работаю в .NET 4.5.2 на компьютере с Windows 10.
Любая помощь будет принята с благодарностью.
Спасибо за ваше время.
Взгляните на предоставленный здесь ответ и дайте мне знать, требуется ли больше объяснений. Http://stackoverflow.com/a/38994745/5233410 – Nkosi
Если вы хотите, чтобы ваш класс прошел тестирование на единицу, вы должны следовать регулярным хорошие практики, связанные с тем, что называется инъекцией зависимостей (DI). В этом случае вы не должны использовать WPF-специфический класс (Dispatcher), особенно с помощью специального приложения класса _STAT_ WPF. Вместо этого обработайте Диспетчер как зависимость и введите его в свой класс, а не сам Диспетчер, но некоторый интерфейс, который предоставляет нужные вам методы. Такой интерфейс вы должны создавать и реализовывать сами и обертывать в него диспетчер WPF. Затем в модульном тесте вы просто предоставляете другую, не WPF-реализацию этого IDispatcher. – Evk