Как правильно для тестируемости добавить функциональность в ComboBox?

Желаемая функциональность «расширенного» поля со списком — это метод быстрого поиска. Каждый элемент в поле со списком имеет метод ToString(), чтобы их можно было отобразить в раскрывающемся списке. При щелчке элемента в раскрывающемся списке наблюдатели поля со списком уведомляются о выборе.

Кроме того, каждый раз, когда набранный текст в поле со списком изменяется, создается список «Кандидаты», состоящий из всех тех элементов в раскрывающемся списке, которые содержат набранный до сих пор текст. Нажатие Enter приведет вас к первому кандидату в этом списке, повторное нажатие Enter прокручивает вас по списку.

Я реализовал эту функциональность, производную от ComboBox - я решил, что это имеет смысл, поскольку функционально я все еще оставляю поле со списком, просто добавлена ​​эта функция «QuickFind». Тем не менее, логика создания списка кандидатов и его циклического просмотра, хотя и проста, не совсем тривиальна, и ее можно было бы протестировать.

Однако, как видно здесь, не так-то просто протестируйте ComboBox, просто сконструировав его и используя дополнительные процедуры, которые я добавил — он должен существовать в форме, чтобы вести себя так же, как в приложении. Это кажется слишком большим усилием, чтобы протестировать простое дополнение к простому комбинированному полю!

Однако ничто в коде для циклического перебора кандидатов не относится к моему приложению - я создал общий элемент управления, который можно использовать в любом количестве контекстов, единственное требование состоит в том, чтобы объекты в поле со списком имели метод ToString(), который это то же самое ограничение, которое в любом случае накладывается на объекты, попадающие в обычные поля со списком, и гарантируется C# .NET.

Итак, имея в виду возможность тестирования, куда бы вы поместили расширенную функциональность?


person Paul Smith    schedule 28.01.2009    source источник
comment
Я думаю, что уже ясно дал понять во вчерашнем посте: чтобы иметь возможность писать модульные тесты для этого, вам нужно разделить управление графическим интерфейсом и логику. Если есть еще вопросы, спрашивайте :)   -  person Gerrie Schenck    schedule 28.01.2009


Ответы (1)


Как и в сообщении, на которое вы ссылаетесь: отделение логики от элементов графического интерфейса также является решением здесь.

Вам следует рассмотреть возможность использования класса, подобного контроллеру, который предоставляет список элементов, которые вы можете привязать к DataSource вашего ComboBox. Сам контроллер отвечает за ведение этого списка.

Поэтому всякий раз, когда вы вводите букву в ComboBox, вы вызываете функцию контроллера, скажем, UpdateList(string typedString). Таким образом, вы разделили логику заполнения списка «кандидатами».

Теперь вы можете легко написать ряд тестов, каждый из которых вызывает UpdateList() с разными аргументами, а затем проверяет список элементов. Для тестирования не требуется ничего графического интерфейса, вы только тестируете сам алгоритм.

person Gerrie Schenck    schedule 28.01.2009
comment
Спасибо, Джерри - здесь что-то щелкает немного лучше, чем когда вы отвечали ранее! Однако как мне узнать, что я подключил вызовы UpdateList к правильным событиям? Должен ли я просто сделать эту часть логики достаточно простой, чтобы проверка выполнялась? - person Paul Smith; 28.01.2009
comment
Я не совсем понимаю ваш вопрос, но вы хотите проверить логику заполнения списка кандидатов, верно? Так что пока забудьте о подключении событий к методу UpdateList. Другое дело, как будет использоваться метод, в вашем случае он будет вызван событием ComboBox и в вашем тесте. - person Gerrie Schenck; 28.01.2009
comment
Может быть, моя философия модульного тестирования неверна. Я могу изолировать список кандидатов в отдельный класс, но как проверить требование «Когда я нажимаю Enter, отображается следующий кандидат»? Конечно, я могу проверить Когда я вызываю f(), запрашивается следующий кандидат, и я могу получить Когда я нажимаю Enter, f() - person Paul Smith; 29.01.2009
comment
... вызывается только при визуальном осмотре. Обработка ключей в Windows Forms является "сложной" - я не знаю, как быть уверенным, что я переопределил правильный метод/подключил правильные события. Когда я не уверен, я обычно использую тест, но я не могу написать достаточный тест. - person Paul Smith; 29.01.2009