Не зависящие от интерфейса Mocking Frameworks для C # - PullRequest
15 голосов
/ 12 июля 2010

Я новичок в издевательстве, так что я мог бы ошибиться, но я считаю, что большинство сред имитации зависят от интерфейса. К сожалению, большая часть нашего кода не использует интерфейс. Сейчас на днях я увидел инфраструктуру Mocking в Java, которая воспроизводила байт-код класса \ объекта, чтобы не вызывать его внутренние методы, но вы все равно можете проверить, вызывал ли он эти методы.

У меня вопрос: есть ли в .Net какие-то насмешливые фреймворки, способные на подобное? Я ищу что-то бесплатное и не хочу, чтобы методы были виртуальными или абстрактными.

Ответы [ 4 ]

10 голосов
/ 20 июля 2010

Microsoft Research разработала для этого молей , которая является частью Pex, но может быть установлена ​​независимо.И это бесплатно.На сайте есть хорошая вводная статья (pdf) , в которой объясняется, как издеваться над статическим методом.Требуется некоторое время, прежде чем они доберутся до того, что вам нужно (стр. 16, задание 3).

Здесь и здесь (канал 9). Вы можете найти примеро том, как заглушки DateTime.Now.Используя родинки, вы можете издеваться над чем угодно.

8 голосов
/ 12 июля 2010

TypeMock Isolator может издеваться над любым классом .NET, но это не бесплатно (или даже дешево). Я не уверен, как именно это работает, но он достигает того же конечного результата.

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

6 голосов
/ 12 июля 2010

Вы можете использовать классы вместо интерфейсов с Moq и Rhino.Mocks , но проверяемые методы должны быть виртуальными.Ответ Марка Рушакова на TypeMock правильный (+1).

Наилучший вариант - это рефакторинг существующего кода для проверки (что может занять время).Я бы рекомендовал прочитать Эффективная работа с устаревшим кодом от Michael Feathers.

1 голос
/ 26 июля 2010

Множество фреймворков для .NET используют Castle Dynamic Proxy для создания макетов во время выполнения. Следовательно, ограничение, позволяющее только максимизировать интерфейс / виртуальные методы, исходит от Касла, и я думаю, что коренится в CLR. И MOQ , и RhinoMocks способны имитировать виртуальные методы, и это прекрасно.

Оба класса и интерфейсы могут быть Прокси, однако только виртуальные члены может быть перехвачен.

Я бы посоветовал начать создавать абстрактные базы для тех классов, которые необходимо смоделировать, и чтобы конкретный класс расширял их. Затем абстрактную базу можно обойти и высмеять. Это действительно упражнение по рефакторингу, которое не слишком сложное.

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