如何将Moq的SetReturnsDefault方法用于类?

问题描述 投票:0回答:1

经过大约一个小时的努力,Moq的 SetReturnsDefault 方法来配合我的测试,我直接从Moq的第4版仓库中复制了一个测试。

    // I didn't copy this part:
    public interface IFoo
    {
        public int Value { get; set; }
    }

    // Just this part:
    [Fact]
    public void ReturnsDefaultValueOnProperty()
    {
        var mock = new Mock<IFoo>();
        mock.SetReturnsDefault(int.MinValue);

        Assert.Equal(int.MinValue, mock.Object.Value); 
        // Passes ✔
    }

它的工作原理是: 然而,当我把接口 IFoo 为类 Foo,它失败了。

    public class Foo
    {
        public int Value { get; set; }
    }

    [Fact]
    public void ReturnsDefaultValueOnProperty()
    {
        var mock = new Mock<Foo>();
        mock.SetReturnsDefault(int.MinValue);

        Assert.Equal(int.MinValue, mock.Object.Value); 
        // ❌ Assert.Equal() Failure Expected: -2147483648 Actual: 0
    }

我猜测,当它使用默认的构造函数时 Foo, Value 设置为 default(int),Moq必须看一看,并决定它不需要使用 SetReturnsDefault的默认值?我测试的大多数类都是类似于 Foo问:如何在不改变类本身的情况下为Moq中的属性设置默认值?

特别是,我想为所有的属性设置默认的字符串值。stringobject 的属性。

.net-core mocking moq xunit
1个回答
0
投票

你不能这样做。

正如Nkosi所指出的那样。工作量 只能与可覆盖的成员一起工作(virtualabstract). 最后我按测试实例化了我的模型,这是我一开始就应该做的(我只是懒惰)。如果你真的想在不改变模型结构的情况下自动给模型赋值,你可能想在一个帮助方法中使用反射,在类属性类型上进行比较来赋值。

foreach (var property in foo.GetType().GetProperties()) 
{
    if (property.PropertyType == typeof(string)) {
        property.SetValue(foo, "default value");
    }
    // etc...
}

这是不言而喻的,但如果你走这条路,尽可能保持简单,以避免在测试代码中引入错误。

© www.soinside.com 2019 - 2024. All rights reserved.