Как провести модульное тестирование виртуального метода в абстрактном классе?

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

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

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


person lance    schedule 05.08.2011    source источник


Ответы (3)


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

person Jon Skeet    schedule 05.08.2011
comment
Я использую Rhino Mocks, который дает мне экземпляр абстрактного класса. Но я /думаю/ это /не позволит мне выполнить виртуальный метод на этом экземпляре. Он безоговорочно вернет значение по умолчанию для выходного типа. Связанный: stackoverflow.com/questions/6960459/ - person lance; 05.08.2011

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

person J Lundberg    schedule 05.08.2011

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

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

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

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

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

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

person Lee Louviere    schedule 05.08.2011