Создание гибрида фиктивного и анонимного объекта с использованием, например, Moq и AutoFixture?

Во время работы я столкнулся с классом, который выглядит следующим образом:

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;
}
6
задан Grzesiek Galezowski 18 February 2012 в 23:41
поделиться