Как протестировать виртуальный метод на абстрактном классе? - PullRequest
1 голос
/ 05 августа 2011

У меня есть абстрактный класс C #, который ведет себя в виртуальном методе.Мне нужно протестировать это поведение в этом виртуальном методе (не вопрос: когда этот метод вызывается).Я вижу три варианта:

1) создать фиктивную реализацию абстрактного класса
2) использовать дочерние элементы для вызова виртуального метода (дублированные тесты для дочерней реализации)
3) другой вариант, кто-то здесьуказывает

Я склоняюсь к # 1.Это самый умный способ проверить это поведение?

Ответы [ 3 ]

4 голосов
/ 05 августа 2011

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

1 голос
/ 05 августа 2011

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

Но если вам нужно изменить поведение, которое должны наследовать все дети ...

Объедините 1 и 2. Испытание с использованием манекена в качестве контрольного теста.

Затем протестируйте, используя как минимум 1 практическое использование поведения, чтобы убедиться, что оно работает с реальным случаем.

Разработчики, пишущие детям, несут ответственность за их поведение.

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

1 голос
/ 05 августа 2011

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

...