Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Paul SmithОтветов: 1

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

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

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

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

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

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

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

unit-testingwinformstestability

Ответы

Ответ 1 · рейтинг 1 · Gerrie Schenck

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы