簡體   English   中英

為什么AutoFixture.AutoMoq默認會進行遞歸模擬?

[英]Why does AutoFixture.AutoMoq make recursive mocks by default?

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

這個問題的意見應該回答為什么 ,但隨后有后續評論原題:

但是,有一個簡單的方法來禁用[遞歸模擬]會很不錯。

這並不做到。 如果你看看AutoMoqCustomization的實現,那就是使用MockPostProcessor打開遞歸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還設置CallBasetrue ,所以省略MockPostprocessor也禁用CallBase設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM