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>();
}
}
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>();
}
}