默认情况下,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.3 AutoFixture.AutoMoq.3.16.5
答案 0 :(得分:3)
对问题的评论应该回答为什么的原始问题,但后面的评论是:
但是,有一种简单的方法可以禁用[递归模拟]。
如果你看一下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
设置。