Как я могу написать модульный тест для класса контроллера, который использует winforms для представлений?

StackOverflow https://stackoverflow.com/questions/128086

Вопрос

Кто-нибудь смог успешно провести модульное тестирование методов, которые, по необходимости, подключены к Системе?Windows.Формы.Класс формы?

Недавно я работал над приложением C # winforms, пытаясь создать его с использованием структуры MVC.Это достаточно сложно, учитывая, что фреймворк на самом деле не создан с учетом этого.

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

Я использовал Moq потому что он обладает некоторыми приятными функциями безопасности типов и позволяет имитировать конкретные типы.Но, к сожалению, это не позволяет мне "ожидать" вызовов методов или свойств конкретного типа, которые не являются ни виртуальными, ни абстрактными.И поскольку класс Form не был создан с учетом подклассов, это большая проблема.Мне нужно иметь возможность имитировать класс Form, чтобы предотвратить создание реальных окон, например, "ожидая" ShowDialog.

Таким образом, я не могу запускать какие-либо модульные тесты, которые в значительной степени взаимодействуют с подклассами Form, каковыми являются мои представления.

Есть ли кто-нибудь, кто успешно модульно протестировал этот тип кода?Как тебе это удалось?

Это что-то, что другие насмешливые фреймворки могут обойти?Будут ли методы на основе строк, используемые другими фреймворками-имитаторами, подчиняться тем же ограничениям?Могу ли я написать свои собственные явные макетные классы с длинной обработкой, или отсутствие виртуальных участников помешает мне таким же образом подавить поведение окна?

Или есть какой-то способ, о котором я не подумал, структурировать мои классы так, чтобы связанный с формами код заканчивался в методах и классах тривиальной сложности, так что я могу уйти без их явного модульного тестирования, без того, чтобы моя совесть избивала меня за это?

Это было полезно?

Решение

Лучший метод, о котором я слышал / который использовался для модульного тестирования с элементами графического интерфейса, - это Скромный Диалог шаблон/метод.По сути, Формы - это всего лишь интерфейс, а вся реальная работа выполняется в других классах.Вы проводите модульное тестирование классов, которые предоставляют функциональность, а затем просто привязываете события вашего графического интерфейса к соответствующим методам в этих классах.

Другие советы

Моя текущая мысль заключается в том, что мне, возможно, придется использовать композицию, а не наследование с классом Form, чтобы отделить от него контроллеры.

Это имеет тот недостаток, что каждый раз, когда мне нужно использовать элемент класса Form, который я не планировал, мне нужно явно добавлять его в мой интерфейс просмотра.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top