DefaultValue.Mock 的自动嵌套模拟未按预期工作

Automatic nested mocking with DefaultValue.Mock not working as expected

Moq 声称它可以自动模拟递归或嵌套对象 https://github.com/Moq/moq4/wiki/Quickstart#customizing-mock-behavior 但是我很难让它真正起作用。

我直接从 Moq 自己的测试套件复制了一个现有测试,但它对我来说失败了,但我不明白为什么。

这是我从Moq复制的逐字测试(原始来源:https://github.com/Moq/moq4/blob/8bc9b111640203af3995fbac98160a5d1f9e1ae2/UnitTests/MockBehaviorFixture.cs#L124

[Fact]
public void ReturnsMockDefaultValueForLooseBehaviorOnAbstract()
{
    var mock = new Mock<Foo>(MockBehavior.Loose) { DefaultValue = DefaultValue.Mock };

    var value = mock.Object.Bar;

    Assert.True(value is IMocked);

    value = mock.Object.GetBar();

    Assert.True(value is IMocked);
}

这是我在与测试相同的文件中创建的 Foo 的定义:

public class Foo
{
    public List<string> Bar { get; set; }
    public List<string> GetBar()
    {
        return new List<string>();
    }
}

我在 Moq 网站上找到的所有内容都让我认为这应该可行,但上面的 Assert.True 调用失败了。

在您给出的示例中,您的 属性 和方法不是虚拟的,因此 Moq 不能用任何行为覆盖它们。在 link 的示例中,属性 和方法都是抽象的,因此 Moq 可以并且确实会覆盖行为。

在方法和 属性 中添加 virtual 修饰符使测试通过:

public class Foo
{
    public virtual List<string> Bar { get; set; }
    public virtual List<string> GetBar()
    {
        return new List<string>();
    }
}