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
次呼叫失败。
答案 0 :(得分:2)
在您给出的属性和方法不是虚拟的示例中,因此Moq无法使用任何行为覆盖它们。在链接的示例中,属性和方法都是抽象的,因此Moq可以并且确实覆盖了行为。
将virtual修饰符添加到方法和属性中以使测试通过:
public class Foo
{
public virtual List<string> Bar { get; set; }
public virtual List<string> GetBar()
{
return new List<string>();
}
}