gpt4 book ai didi

c# - 为什么 AutoFixture.AutoMoq 默认进行递归模拟?

转载 作者:太空狗 更新时间:2023-10-29 21:50:18 24 4
gpt4 key购买 nike

默认情况下,Moq 不进行递归模拟。也就是说,对于对模拟没有期望的成员,Moq 返回默认值。例如,给定:

public interface IFoo
{
Bar Bar();
}

public class Bar
{
}

然后:

[TestMethod]
public void RecursiveMocksAreDisabledByDefaultInMoq()
{
var foo = new Mock<IFoo>().Object;
Assert.IsNull(foo.Bar());
}

但是,在 AutoFixture.AutoMoq 中,递归模拟是默认启用的,如:

[TestMethod]
public void RecursiveMocksAreEnabledByDefaultInAutoFixture()
{
var fixture = new Fixture().Customize(new AutoMoqCustomization());
var foo = fixture.Create<IFoo>();
Assert.IsNotNull(foo.Bar());
}

这是为什么呢?还有,如何关闭 AutoFixture.AutoMoq 中的自动递归模拟?

谢谢

Moq.3.1.416.3AutoFixture.AutoMoq.3.16.5

最佳答案

问题的评论应该回答原始问题为什么,但随后有后续评论:

It would be nice, though, to have an easy way to disable [recursive mocks].

这并不很难做到。如果您查看 AutoMoqCustomization 的实现,它是 use of MockPostProcessor打开递归模拟。如果您不希望这样,您可以创建自己的不这样做的自定义:

public class AutoNonRecursiveMoqCustomization : ICustomization
{
public void Customize(IFixture fixture)
{
if (fixture == null)
throw new ArgumentNullException("fixture");

fixture.Customizations.Add(
new MethodInvoker(
new MockConstructorQuery()));
fixture.ResidueCollectors.Add(new MockRelay());
}
}

MockPostprocessor 还将 CallBase 设置为 true,因此通过省略 MockPostprocessor 您还可以禁用 CallBase 设置。

关于c# - 为什么 AutoFixture.AutoMoq 默认进行递归模拟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21921789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com