2013-08-28 9 views
4

我在我的測試慣例中使用了AutoMoqCustomization。處理AutoFixture和Moq之間的樣本創建不一致問題

考慮下面的代碼。一切工作都很好,直到我將一個構造函數添加到其中一個具體類。當我這樣做時,我得到「找不到無參數的構造函數」。我們知道AutoFixture對構造函數沒有問題,因爲它向我提供了測試對象one,它證明可以從IThings分配......沒有失敗。所以它一定是moq。

這是有道理的,因爲我認爲builder是由moq生成並傳入GetCommands方法。所以我想我可以看到控制已經從AutoFixture傳遞到moq。

這需要照顧的原因,但我該怎麼辦呢?有沒有辦法指導moq如何處理ThingOne,或者有沒有辦法指示AutoFixture忽略IThingBuilders的moq,而是做一些Fixtury?

public class TestClass 
{ 
    public interface IThingBuilders 
    { 
     T1 Build<T1>() where T1 : IThings; 
    } 
    public interface IThings 
    { 
    } 
    public class ThingOne : IThings 
    { 
     public ThingOne(string someparam) 
     { 
     } 
    } 
    public class ThingTwo : IThings 
    { 
    } 
    public class SomeClass 
    { 
     public List<IThings> GetCommands(IThingBuilders builder) 
     { 
      var newlist = new List<IThings>(); 
      newlist.Add(builder.Build<ThingOne>()); 
      newlist.Add(builder.Build<ThingTwo>()); 
      return newlist; 
     } 
    } 
    [Theory, BasicConventions] 
    public void WhyCannotInstantiateProxyOfClass(ThingOne one, ThingTwo two, IThingBuilders builder, SomeClass sut) 
    { 
     Assert.IsAssignableFrom<IThings>(one); 
     Assert.IsAssignableFrom<IThings>(two); 

     var actual = sut.GetCommands(builder); 

     Assert.Equal(1, actual.OfType<ThingOne>().Count()); 
     Assert.Equal(1, actual.OfType<ThingTwo>().Count()); 
    } 
} 
+0

This [answer](https://github.com/AutoFixture/AutoFixture/issues/159#issuecomment-23314376)可能會有所幫助。 –

回答

2

由於有在起訂量沒有擴展點,使AutoFixture鉤在和供應ThingOne的值,所以沒有一個整體很多你可以做的。

但是,您可以使用Moq的SetReturnsDefault<T>方法。然後修改上述測試是這樣的:

[Theory, BasicConventions] 
public void WhyCannotInstantiateProxyOfClass(
    ThingOne one, ThingTwo two, IThingBuilders builder, SomeClass sut) 
{ 
    Assert.IsAssignableFrom<IThings>(one); 
    Assert.IsAssignableFrom<IThings>(two); 
    Mock.Get(builder).SetReturnsDefault(one); // Add this to make the test pass 

    var actual = sut.GetCommands(builder); 

    Assert.Equal(1, actual.OfType<ThingOne>().Count()); 
    Assert.Equal(1, actual.OfType<ThingTwo>().Count()); 
} 

這比寫一個特定Setup/Returns對更容易一些,但不多。您可以將該代碼移動到AutoFixture自定義,但是由於這是Mock實例的通用方法,因此您需要明確地調用此代碼。 ThingOne爲了設置該返回類型的默認值。不是特別靈活。

相關問題