MOQ -如何使用SetupGet/SetupSet手动创建备份属性

本文关键字:创建 备份 属性 SetupSet 何使用 SetupGet MOQ | 更新日期: 2023-09-27 17:49:24

我知道我们可以调用SetupAllProperties()来自动创建后台属性。但这限制太大了,因为它不允许我在getter/setter中执行额外的代码。例如,我想创建一个调用其他方法/事件/逻辑的moq设置器。

下面的代码示例再现了问题

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

MOQ -如何使用SetupGet/SetupSet手动创建备份属性

一个简单的解决方案。

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

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