Во время работы я столкнулся с классом, который выглядит следующим образом:
public class MyObject
{
public int? A {get; set;}
public int? B {get; set;}
public int? C {get; set;}
public virtual int? GetSomeValue()
{
//simplified behavior:
return A ?? B ?? C;
}
}
Проблема в том, что у меня есть код, который обращается к A, B и C и вызывает метод GetSomeValue () (сейчас я бы сказал это не очень хороший дизайн, но иногда у меня связаны руки ;-)). Я хочу создать макет этого объекта, в котором в то же время для A, B и C установлены некоторые значения. Итак, когда я использую moq как таковой:
var m = new Mock<MyObject>() { DefaultValue = DefaultValue.Mock };
позволяет мне настроить результат для метода GetSomeValue (), но для всех свойств установлено значение null (и настройка всех из них с помощью Setup () довольно громоздка, поскольку реальный объект представляет собой неприятный объект данных и имеет больше свойств, чем в приведенном выше упрощенном примере).
С другой стороны, использование AutoFixture следующим образом:
var fixture = new Fixture();
var anyMyObject = fixture.CreateAnonymous<MyObject>();
Оставляет меня без возможности заблокировать вызов метода GetSomeValue ().
Есть ли способ объединить их, чтобы получить анонимные значения и возможность настройки результатов вызова?
Редактировать
На основе ответа nemesv я разработал следующий служебный метод (надеюсь, я понял):
public static Mock<T> AnonymousMock<T>() where T : class
{
var mock = new Mock<T>();
fixture.Customize<T>(c => c.FromFactory(() => mock.Object));
fixture.CreateAnonymous<T>();
fixture.Customizations.RemoveAt(0);
return mock;
}