Запуск событий управления пользовательским интерфейсом из модульного теста - PullRequest
3 голосов
/ 19 сентября 2008

Как новичок в TDD, я пытаюсь написать тест, в котором предполагается, что значение свойства было изменено в PropertyGrid (C #, WinForms, .NET 3.5).

Изменение свойства объекта в сетке свойств не вызывает событие (достаточно справедливо, поскольку это событие, вызванное пользовательским интерфейсом, поэтому я понимаю, почему изменение принадлежащего объекта может быть невидимым для него).

У меня также была такая же проблема с включением AfterSelect для TreeView при изменении свойства SelectedNode.

У меня может быть функция, которую может вызывать мой модульный тест, которая имитирует код, который будет вызывать событие пользовательского интерфейса, но это загромождает мой код, и если я не сделаю его общедоступным, мне придется написать все свои тесты в тот же проект или даже класс объектов, которые я тестирую (опять же, я вижу это как беспорядок). Это кажется мне уродливым и может привести к проблемам с ремонтопригодностью.

Существует ли соглашение для такого рода модульного тестирования на основе пользовательского интерфейса

Ответы [ 3 ]

5 голосов
/ 19 сентября 2008

Для модульного тестирования вашего кода вам нужно будет смоделировать объект элемента интерфейса UI. Есть много инструментов, которые вы можете использовать для этого, и я не могу рекомендовать один над другим. Вот хорошее сравнение между MoQ и Rhino Mocks здесь в блоге Фила Хаака , которое я нашел полезным и может быть полезным для вас.

Ничто не следует учитывать при использовании TDD - создание интерфейса для ваших представлений поможет в процессе TDD. Для этого существует модель проектирования (вероятно, более одной, но я ее использую), которая называется Model View Presenter (теперь разделена на Passive View и Supervisor Controller). Выполнение одного из них сделает ваш код намного более тестируемым в будущем.

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

2 голосов
/ 19 сентября 2008

Microsoft имеет UI Automation, встроенную в .Net Framework. Возможно, вы сможете использовать это для симуляции обычного использования вашего программного обеспечения пользователем.

Существует статья MSDN " Использование автоматизации пользовательского интерфейса для автоматического тестирования , которая является хорошей отправной точкой.

1 голос
/ 19 сентября 2008

Один вариант, который я бы порекомендовал для простоты, - это чтобы ваш пользовательский интерфейс просто вызывал вспомогательный класс или метод во время запуска события и модульного тестирования этого. Убедитесь, что он (ваш обработчик событий в пользовательском интерфейсе) имеет как можно меньше логики, и тогда я уверен, что вы будете знать, что делать.

Может быть довольно сложно достичь 100% покрытия в ваших юнит-тестах. Под сложным я имею в виду, конечно, неэффективно. Даже если вы разберетесь в чем-то подобном, это, на мой взгляд, вероятно, добавит больше сложности к вашей кодовой базе, чем заслуживает ваш модульный тест. Если вы не уверены, как разделить свою логику на отдельный класс или метод, это еще один вопрос, с которым я бы хотел помочь.

Мне будет интересно посмотреть, какие другие методы люди должны работать с этим типом проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...