2012-04-18 3 views
13

Допустим, у меня есть интерфейс:AutoFixture и интерфейсы

public interface IFoo 
{ 
    int Bar1 { get; set; } 
    int Bar2 { get; set; } 
} 

Если IFoo был класс, я мог бы написать:

fixture.CreateAnonymous<IFoo>(); 

и результат будет иметь номера, установленные для Bar1 и Bar2.

Но как это сделать с интерфейсом? Я попытался использовать AutoMoqCustomization, но это похоже на свойства с типом интерфейса, а не с самими интерфейсами.

Я ищу автоматизированный способ, как CreateAnonymous для классов. Currenlty Я создаю интерфейс mock и настраиваю его свойства явно, что я хотел бы сохранить. Я должен упустить что-то очевидное.

+1

Вот как это сделать: http://blog.ploeh.dk/2013/04/08/how-to-automatically-populate-properties-with-automoq –

ответ

12

Если вы хотите map an interface to a specific concrete class, вы можете, конечно, сделать это:

fixture.Register<IFoo>(() => fixture.CreateAnonymous<ConcreteFoo>()); 

(Или fixture.Register<IFoo>(fixture.CreateAnonymous<ConcreteFoo>) для краткости)

Однако AutoMoq (а также AutoRhinoMocks и AutoFakeItEasy) также вариант. При этом попытка создания экземпляра IFoo вернет созданный Moq прокси, который реализует IFoo.

Однако с Moq вы не увидите, как заполняются Bar1 и Bar2. Это связано не только с тем, что AutoFixture не вызывает сеттеры, а потому, что Moq не (по умолчанию) реализовать геттеров.

Чтобы выполнить эту работу для Moq, необходимо вызвать SetupAllProperties() на самом Mock<T>. Хотя это возможно, это немного сложно сделать в текущем графике AutoMoq. Для этого уже есть work item, но если вы прочитаете обсуждение, вы увидите, что проблема сложнее, чем казалось бы.

В любом случае, интерфейс со свойствами является плохой идеей по ряду других причин, поэтому лучшим решением является перепроектирование интерфейса, чтобы он не обладал свойствами.

+3

«Интерфейсы со свойствами - плохая идея» - Всегда? Если бы вы могли дать мне ссылку? :) – Pol

+2

Множество причин. Закон Деметры является одним из них: http://en.wikipedia.org/wiki/Law_of_Demeter. Позвольте мне спросить что-то взамен: какое преимущество дает интерфейс со свойствами? –

+0

Я знаком с Законом Деметры. Я использую свойства (в 90% случаев только для чтения) для объектов, но только для некоторого подмножества данных, только из-за Закона Деметры, а не для всех данных. Тем не менее, иногда они полезны. – Pol

Смежные вопросы