【问题标题】:MOQ - how to manually create a backing property using SetupGet/SetupSet?MOQ - 如何使用 SetupGet/SetupSet 手动创建支持属性?
【发布时间】:2011-04-07 08:39:53
【问题描述】:

我知道我们可以调用SetupAllProperties() 来自动创建支持属性。但这太严格了,因为它不允许我在 getter/setter 中执行额外的代码。例如,我想创建一个最小起订量的 setter 来调用其他一些方法/事件/逻辑。

以下代码示例重现了该问题

public interface IA
{
    int B { get; set; }
};

class Test
{
    [Test]
    public void BackingPropertyTest()
    {
        int b = 1;

        var mockA = new Mock<IA>();
        //mockA.SetupAllProperties();
        mockA.SetupGet(m => m.B).Returns(b);
        mockA.SetupSet(m => m.B).Callback(val => b = val);

        mockA.Object.B = 2;
        Assert.AreEqual(2, b);              // pass. b==2
        Assert.AreEqual(2, mockA.Object.B); // fail.  mockA.Object.B==1, instead of 2
    }
}

由于 getter 设置为返回局部变量的值(我猜现在是捕获的变量),我希望看到 mockA.Object.B == 2。但取而代之的是1

我从根本上错过了什么吗?或者这是一个最小起订量错误?我正在运行 MOQ 4.0.10501.6

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

    一个简单的解决方案。

    将 Returns(b) 改为 Returns(() => b),以使 'b' 成为捕获的变量,而不仅仅是通过值传递给方法的变量。

    mockA.SetupGet(m => m.B).Returns(() => b);
    

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 2020-02-08
      • 2011-05-07
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      相关资源
      最近更新 更多