2013-06-26 3 views
1

Я использую Rhino Mocks 3.6Как поиздеваться класс, который имеет частный конструктор с помощью Rhino Mocks

У меня есть класс «Configuration.cs», который имеет частный конструктор (я сделал это для реализации Singleton). Теперь я хочу издеваться над этим классом (Partial Mock), но я не могу этого сделать. Ошибка:

Невозможно создать прокси класса: Efi.CrmIntegration.MonarchServices.Utilities.Configuration. Не удалось найти конструктор без параметров. Имя параметра: constructorArguments

Какое решение для этого.

ответ

3

Статические синглеты трудно издеваться и тестировать, и их следует избегать в идеале. Как указывал RhinoMocks, вы не можете сделать частичный макет конфигурации singleton, но у вас есть некоторые опции.

  1. Сделайте свой частный конструктор общедоступным. Однако это следует считать быстрым взломом. Есть намного лучшие способы сделать это.

  2. Измените способ создания одного синглтона. Дайте вашему классу Configuration интерфейс, допустим, IConfiguration. Вероятно, у вас уже есть статическое свойство Instance на Configuration. Измените его тип на IConfiguration и дайте ему публичный сеттер. В ваших модульных тестах, mock или stub IConfiguration, и установите для этого свойство Configuration.Instance. Это все еще что-то вроде взлома (но это полезно, когда у вас много классов, которые уже используют синглтон, и у вас нет времени для реализации следующего варианта).

  3. Использование инъекции зависимости. Дайте вашему классу Configuration интерфейс, скажем, IConfiguration. Классы, которые имеют зависимость от одноэлементного кода Configuration, должны быть изменены для принятия параметра IConfiguration в их конструкторе. Когда вы создаете экземпляр одного из этих классов, вы вводите в одиночный экземпляр Configuration. При тестировании сделайте макет или заглушку типа IConfiguration и передайте это вместо классов. Вы можете улучшить это с помощью инфраструктуры инъекций зависимостей, таких как Castle Windsor или Ninject, которые вы, вероятно, могли бы использовать, чтобы избавиться от потребности в статическом одиночном пространстве.

Я настоятельно рекомендую вам изменить свой дизайн и использовать вариант 3 (при наличии рамки для инъекций зависимости, если это возможно).

+0

Спасибо, Крис .. Я пошел со вторым вариантом, как вы упомянули (у вас много классов, которые уже используют синглтон, и у вас нет времени для реализации следующей опции) - это то, что у меня есть сценарий. – shals1031