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

Автопринадлежности и интерфейсы

Скажем, у меня есть интерфейс:

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

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

fixture.CreateAnonymous<IFoo>();

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

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

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

4b9b3361

Ответ 1

Если вы хотите сопоставить интерфейс с конкретным конкретным классом, вы можете это сделать:

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. Для этого уже есть рабочий элемент, но если вы прочитаете обсуждение, вы увидите, что проблема сложнее, чем казалось бы.

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