[英]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
還設置CallBase
至true
,所以省略MockPostprocessor
也禁用CallBase
設置。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.