В моем тесте я пытаюсь смоделировать выбор, выбранный в диалоговом окне.
Обычно, если написание тестов затруднительно, это означает, что код должен быть лучше спроектирован.
В этом случае прямая зависимость от компонентов пользовательского интерфейса не является идеальной.Здесь может помочь шаблон под названием порты и адаптеры (он же Гексагональная архитектура, он же Чистая архитектура).Таким образом, вы определяете интерфейсы с точки зрения приложения, а затем небольшие объекты-адаптеры реализуют эти интерфейсы.
Таким образом, вы можете заставить приложение определять интерфейс, который обеспечивает то, что ему нужно:
public interface IUserInteraction
{
int ModalOptionsWindow();
}
с реализацией:
public sealed class WpfUserInteraction : IUserInteraction
{
int ModalOptionsWindow()
{
OptionsViewModel vm = //.....
dialog.ShowDialog(new OptionsWindow(vm));
return vm.Result;
}
}
Что именно покрывает интерфейс, зависит от вас.Как правило, мне нравится хранить мои ViewModels на стороне порта приложения и иметь только представления на стороне интерфейса UI порта.
Как только у вас есть интерфейс, введите IUserInteraction
и вызовите кодтот.После этого модульное тестирование упрощается.
Однако, если вы находитесь в сценарии с устаревшим кодом, где вам нужно написать тесты до рефакторинга, то вы можете код пользовательского интерфейса для модульных тестов.Это просто не легко.См. WpfContext
или WindowsFormsContext
в этом старом архиве , чтобы узнать, как создать поток STA и прокачать сообщения из модульного теста.