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);
}
Подробнее см. здесь.