Why does AutoFixture.AutoMoq make recursive mocks by default?

Moq does not do recursive mocks by default. That is, for members without waiting for a layout, Moq returns the default values. For example, given:

public interface IFoo
{
    Bar Bar();
}

and

public class Bar
{
}

then

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

However, in AutoFixture.AutoMoq, recursive mocks are enabled by default, as in:

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

Why? And how to turn off automatic recursive mockery in AutoFixture.AutoMoq?

thanks

Moq.3.1.416.3
AutoFixture.AutoMoq.3.16.5
+4
source share
1 answer

Comments on the question should answer the original question about why, but then there is the following comment:

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

. AutoMoqCustomization, MockPostProcessor, mocks. , , :

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.

+1

Source: https://habr.com/ru/post/1528002/


All Articles