4
默認情況下,Moq不會進行遞歸模擬。也就是說,對於沒有模擬預期的成員,Moq返回默認值。例如,給定:爲什麼AutoFixture.AutoMoq默認進行遞歸模擬?
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
您可能會發現[此討論屬於AutoFoq中的默認返回值](https://foq.codeplex.com/discussions/470568)的元素有用 - AutoFoq不會OOTB更改Foq行爲(導致null從方法OOTB返回值)。我也強烈推薦AutoFoq和Foq--但是我很欣賞改變嘲笑庫,不是你剛做的事情。我個人最長時間不明白,一個嘲笑的圖書館如何能夠比Moq更加有用,並且儘管知道它,卻打了很長時間的折扣。 (注意,我用F#編寫了大部分測試) –
因爲「AutoFixture是一個有意見的庫,它所持有的觀點之一是空值是無效的返回值。」 http://stackoverflow.com/a/18170070/126014 –
參見https://autofixture.codeplex.com/workitem/4261 –