2014-02-20 12 views
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 
+1

您可能會發現[此討論屬於AutoFoq中的默認返回值](https://foq.codeplex.com/discussions/470568)的元素有用 - AutoFoq不會OOTB更改Foq行爲(導致null從方法OOTB返回值)。我也強烈推薦AutoFoq和Foq--但是我很欣賞改變嘲笑庫,不是你剛做的事情。我個人最長時間不明白,一個嘲笑的圖書館如何能夠比Moq更加有用,並且儘管知道它,卻打了很長時間的折扣。 (注意,我用F#編寫了大部分測試) –

+3

因爲「AutoFixture是一個有意見的庫,它所持有的觀點之一是空值是無效的返回值。」 http://stackoverflow.com/a/18170070/126014 –

+1

參見https://autofixture.codeplex.com/workitem/4261 –

回答

1

的問題的意見應該回答的爲什麼原來的問題,但隨後有後續評論:

這將是很好,不過,有一個簡單的方法來禁用[遞歸模擬]。

這不是很難做到。如果您查看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還設置CallBasetrue,所以省略MockPostprocessor也禁用CallBase設置。