为什么AutoFixture.AutoMoq默认会进行递归模拟?

时间:2014-02-20 23:13:50

标签: c# mocking moq autofixture

默认情况下,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

1 个答案:

答案 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设置。