Кроты и рефакторинг - PullRequest
       50

Кроты и рефакторинг

2 голосов
/ 16 сентября 2011

Мы начинаем новый проект в моей компании, и было решено, что мы будем использовать Microsoft Moles Framework для ВСЕХ насмешек в юнит-тестах.Мой менеджер в идеале не хочет вводить какие-либо другие Mocking-фреймворки, такие как NSubstitute или Moq, чтобы усложнить проект.Однако я обнаружил, что из-за природы, в которой Moles генерирует Mocks и Stubs, он не очень хорошо работает с инструментами рефакторинга.

Например, мы используем resharper, и если у меня был следующий интерфейс, то moles будут генерироватьзаглушка, например, так:

IMyInterface -> SIMyInterface

Теперь, если бы я реорганизовал IMyInterface под другое имя, такое как: IMyNewInterface

, тогда в моих модульных тестах класс Stub явноНЕ подвергаться рефакторингу из-за того, что оно принципиально имеет другое имя.

Я вижу, что это большая проблема, как только мы получим много перестановок юнит-тестов, что рефакторинг станет кошмаром, а мантра будет "Просто надейсяНичего не измените! "

Кто-нибудь имеет подобный опыт или знает инструмент рефакторинга, который может обрабатывать родинки?


Спасибо и Мерлин, и Майк.Моя команда решила пойти на компромисс и использовать Родинки только для типов, которые мы не можем высмеивать стандартными инструментами, а затем использовать другую среду, такую ​​как NSubstitute для всего остального.

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

ОБНОВЛЕНИЕ 16 АВГУСТА 2012 - Пожалуйста, используйте подделки вместо родинок.Подделки поставляются с Visual Studio 2012, и это полностью поддерживаемая версия продукта Moles.

Moles не имеет поддержки сторонних поставщиков;потому что это не официально выпущенная и поддерживаемая технология, и она все еще меняется.Я создал несколько шаблонов CodeRush, которые производят атрибуты Moles и Pex и методы тестирования;однако, это не помогает с рефакторингом имен типов.

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


ПРЕДЛОЖЕНИЕ MOLES:

Я предлагаю настроить родинки RiSE (еще раз) для создания проекта Moles, который не компилируется, вместо создания скомпилированной сборки.Я знаю, что сборка намного проще, но я предвижу огромное. Это позволяет разработчику рефакторировать имена типа "родинка" и "заглушка" в классах родинки.Кроме того, инструменты рефакторинга, такие как Refactor!Pro должен иметь возможность автоматически рефакторировать как код, так и имена типов родинок, в коде, родинке и тестовых проектах.

0 голосов
/ 29 сентября 2011

Согласно Справочному руководству по Microsoft Moles , в разделе & ldquo; Конфигурация генерации кода & rdquo ;, на стр. 11:

Также возможно отключить компиляцию, в этом случае генератор кода Moles вставит сгенерированные источники C # в проект.

Похоже, что способ отключить указанную компиляцию состоит в том, чтобы добавить элемент Compilation в качестве дочернего элемента (корневого) Moles элемента, если его нет, и добавить к указанному дочернему элементу атрибут ProjectTemplate, установив его значение пути к файлу .csproj. Это основано на прочтении моего описания атрибута IntelliSense указанного атрибута, отображаемого редактором XML в Visual Studio (взято из документации по схеме Moles, которая на моем компьютере имеет значение C:\Program Files\Microsoft Visual Studio 10.0\Xml\Schemas\moles.xsd), которая выглядит следующим образом:

Путь к пустому файлу проекта C #, который будет использоваться для создания проекта сборок Moles для компиляции

...