Вымывание не виртуальных методов в С#

Я пытаюсь протестировать некоторые классы, которые я создал с помощью mocks, но я видел, что все свободные mocking frameworks в С# не могут имитировать не виртуальные методы (если это не интерфейс).

Но, там TypeMock, который может это сделать, так можно. Может ли кто-нибудь показать, как это сделать? Я даже могу попытаться внести вклад в открытую исходную структуру, если я смогу это сделать.

Заранее спасибо

Ответ 1

Я из Typemock, и я не буду обращаться к комментариям "Too Powerful" (хотя это вне меня, почему люди не хотели бы использовать лучший инструмент для работы).

Здесь работает Typemock Isolator. Вы когда-нибудь использовали профилировщик производительности? Изолятор - это профилировщик. Он подключается к CLR и в течение тестового времени запуска, он меняет методы. Когда метод получает JITted, он меняет его, поэтому, когда метод запускается, перед выполнением исходного кода он спрашивает: должен ли я запускать его как изначально, а если нет, что мне делать? И из-за этой конкретной технологии он может издеваться над любым методом и технологией .Net. Что это.

Когда вы устанавливаете поведение с помощью API, ответ на вопросы теперь становится intersting и изменяет поведение во время выполнения этого метода. Простой, но под покровом много работы:)

Изолятор поставляется с VS AddIn для беспрепятственного выполнения тестов в VS, а также с помощью средства командной строки и задач MSBuild или NAnt для использования на сервере сборки.

Буду рад ответить на любые другие вопросы, которые могут возникнуть.

Ответ 2

В соответствии с веб-сайт он использует AOP для перенаправления вызовов:

Typemock Isolator использует аспектно-ориентированную технологию для перенаправления вызовов с реального кода. Это позволяет разработчикам определять поведение внешнего компонента, необходимого для протестированного сценария. Например, вы можете имитировать, что диск заполнен при записи в базу данных, инструктируя Typemock Isolator выкидывать OutOfDiskSpaceException при записи в базу данных. Это сценарий, который будет практически невозможно протестировать без Typemock Isolator. Разработчик определяет поведение в фактическом unit test, а Typemock Isolator автоматически изолирует все необходимые компоненты.

Этот метод требует, чтобы вы настраивали специальную среду, прежде чем запускать тест или использовать плагин VS.

Некоторые люди думают, что способность издеваться над всем делает Typemock слишком мощным, так как вам не нужно так много думать о хорошем дизайне. Цитата из Ayende:

Основной недостаток Type Mock - его сила, он позволяет мне делать ярлыки, которые я не хочу брать, я хочу получить систему с низкой связью и высокой связностью.

Но, конечно, поскольку он является создателем Rhino Mock, он не объективен:)

Я бы подумал, что вам предстоит большая работа, если вы хотите создать фальшивую инфраструктуру с этой функциональностью, поэтому я бы рекомендовал либо купить Typemock, либо научиться кодировать без него:)