Подтвердить что ты не робот

Mocking Frameworks для С#

Я новичок в насмешках, поэтому у меня может быть это совершенно неправильно, но я считаю, что большинство издевательских фреймворков зависят от интерфейса. К сожалению, большая часть нашего кода не использует интерфейс. Теперь на днях я увидел фреймворк Mocking на Java, который воспроизводил байт-код объекта class \, чтобы не вызывать его внутренние методы, но вы все равно можете проверить, что он НАЗЫВАЕТ эти методы.

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Многие фреймворки .NET используют Замок динамического прокси, чтобы создавать mocks во время выполнения. Следовательно, ограничение только разрешить интерфейс/виртуальные методы издеваться происходит из Замка, и я думаю, что он внедрен в CLR. Оба MOQ и RhinoMocks могут издеваться виртуальные методы, которые так же хороши, как и они.

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

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