Как правильно для тестируемости добавить функциональность в ComboBox?
Желаемая функциональность "расширенного" поля со списком - это метод быстрого поиска. Каждый элемент в выпадающем списке имеет метод ToString(), так что они могут отображаться в раскрывающемся списке. При нажатии на элемент в раскрывающемся списке наблюдатели в выпадающем списке уведомляются о выборе.
Кроме того, каждый раз, когда набранный текст в комбинированном ящике изменяется, создается список "Кандидатов", состоящий из всех тех элементов в раскрывающемся списке, которые содержат текст, набранный до сих пор. Нажав Enter, вы попадете к первому кандидату в этом списке, и несколько раз нажмите Enter, чтобы пролистать список.
Я реализовал эту функциональность, выведя из ComboBox - я понял, что это имеет смысл, так как я все еще функционально оставлен с комбинированным списком, он просто добавил эту функцию "QuickFind". Однако логика создания списка кандидатов и его циклического перемещения, хотя и проста, не совсем тривиальна, и ее можно было бы проверить.
Однако, как видно из рисунка, не так-то просто проверить ComboBox, просто создав его и добавив дополнительные подпрограммы, которые я добавил - он должен существовать в форме, чтобы он вел себя так же, как и он. в приложении. Это кажется слишком большим усилием, чтобы протестировать простое дополнение к простому списку!
Однако в коде для циклического прохождения кандидатов нет ничего конкретного для моего приложения - я создал общий элемент управления, который можно использовать в любом количестве контекстов, единственное требование заключается в том, чтобы объекты в выпадающем списке имели метиод ToString(), который это то же самое ограничение, которое накладывается на объекты, входящие в обычные выпадающие списки, и гарантируется C# .NET.
Итак, с точки зрения тестируемости, куда бы вы поместили расширенную функциональность?
1 ответ
Как и в публикации, на которую вы ссылаетесь: отделение логики от элементов графического интерфейса также является решением проблемы.
Вам следует рассмотреть возможность использования класса, подобного контроллеру, который предоставляет список элементов, которые вы можете привязать к источнику данных ComboBox. Сам контроллер отвечает за ведение этого списка.
Поэтому, когда вы вводите букву в ComboBox, вы вызываете функцию на контроллере, скажем, UpdateList(строка typedString). Таким образом, вы разделили логику заполнения списка "кандидатами".
Теперь вы можете легко написать ряд тестов, каждый из которых вызывает UpdateList() с различными аргументами и впоследствии проверять список элементов. Для тестирования не требуется никаких графических элементов, вы тестируете только сам алгоритм.