Moq: настройка свойства без сеттера?

У меня есть следующий класс:

public class PairOfDice
{
    private Dice d1,d2;
    public int Value 
    {
       get { return d1.Value + d2.Value; }
    }
}

Теперь я хотел бы использовать PairOfDice в своем тесте, который возвращает значение 1, хотя я использую случайные значения в своих реальных играх:

[Test]
public void DoOneStep ()
{
    var mock = new Mock<PairOfDice>();
    mock.Setup(x => x.Value).Return(2);
    PairOfDice d = mock.Object;
    Assert.AreEqual(1, d.Value);
}

К сожалению, я получаю ошибку Invalid setup on non-overridable member. Что я могу сделать в этой ситуации?

Обратите внимание, что это моя первая попытка реализовать Unit-Tests.

Ответы

Ответ 1

Ваша проблема в том, что это не virtual. Не потому, что у вас нет сеттера.

Moq не может создать прокси-сервер, поскольку он не может переопределить ваше свойство. Вам либо нужно использовать интерфейс, виртуальный метод, либо абстрактный метод.

Ответ 2

Вы можете использовать .SetupGet для вашего макетного объекта.

например.

[Test]
public void DoOneStep ()
{
    var mock = new Mock<PairOfDice>();
    mock.SetupGet(x => x.Value).Returns(1);
    PairOfDice d = mock.Object;
    Assert.AreEqual(1, d.Value);
}

Подробнее см. здесь.