DefaultValue.Mock自动嵌套模拟无法按预期工作

时间:2015-07-17 18:48:39

标签: unit-testing moq

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次呼叫失败。

1 个答案:

答案 0 :(得分:2)

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

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

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