Moq:设置没有setter的属性?

时间:2010-10-27 23:57:56

标签: c# unit-testing properties 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错误。在这种情况下我该怎么办?

请注意,这是我第一次尝试实施单元测试。

2 个答案:

答案 0 :(得分:47)

您可以在模拟对象上使用.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);
}

有关详细信息,请参阅here

答案 1 :(得分:13)

您的问题是因为它不是virtual。不是因为你没有二传手。

Moq无法构建代理,因为它无法覆盖您的属性。您需要使用接口,虚拟方法或抽象方法。