2013-04-22 21 views
3

我有表達下面的代碼以聲明的方式麻煩:Autofixture:如何以聲明方式表示下列代碼?

[Theory] 
[InlineData(@"-o=C:\Temp\someFile -p=1")] 
[InlineData(@"-p=1 -o=C:\Temp\someFile")] 
public void ParseMissingParameterShouldReturnCorrectResult(
    string argsString 
) 
{ 
    ..... 
    var fixture = new Fixture(); 
    fixture.Register<IFoo>(fixture.Create<Foo>); 
    fixture.Register<IBar>(fixture.Create<Bar>); 

    var sut = fixture.Create<SomeClass>(); 
    ..... 
} 

在我的生產代碼,我有這樣的:

new SomeClass(new Foo(new Bar)) 

與SomeClass的的構造函數定義爲:

public SomeClass(IFoo foo) 

TIA,

大衛

編輯:

SomeClass的看起來像

public class SomeClass : IQux 
{ 
    private readonly IFoo _foo; 

    public SomeClass(IFoo foo) 
    {  
     _foo= foo; 
    } 

回答

3

可以聲明的SUT(這是SomeClass型)作爲在測試方法中的參數:

[Theory] 
[InlineAutoMockData(@"-o=C:\Temp\someFile -p=1")] 
[InlineAutoMockData(@"-p=1 -o=C:\Temp\someFile")] 
public void ParseMissingParameterShouldReturnCorrectResult(
    string argsString, 
    SomeClass sut) 
{ 
} 

一個簡單的方法創建[InlineAutoMockData]屬性爲:

internal class InlineAutoMockDataAttribute : CompositeDataAttribute 
{ 
    internal InlineAutoMockDataAttribute (params object[] values) 
     : base(
      new InlineDataAttribute(values), 
      new AutoDataAttribute(
       new Fixture().Customize(
        new CompositeCustomization(
         new AutoMoqCustomization())))) 
    { 
    } 
} 

注意

如果您還需要在IFooIBar嘲笑情況下設置的期望,你可以凍結他們,使同一Frozen實例在SomeClass實例傳入:

[Theory] 
[InlineAutoMockData(@"-o=C:\Temp\someFile -p=1")] 
[InlineAutoMockData(@"-p=1 -o=C:\Temp\someFile")] 
public void ParseMissingParameterShouldReturnCorrectResult2(
    string argsString, 
    [Frozen]Mock<IFoo> mock, 
    [Frozen]Mock<IBar> stub, 
    SomeClass sut) 
{ 
} 
+0

不幸的是,這不是在我的情況下工作,因爲我得到以下異常:'Ploeh.AutoFixture.Objec tCreationException:AutoFixture無法從nameSpace.IFoo創建實例,很可能是因爲它沒有公共構造函數,是抽象類型或非公共類型。唯一的區別是我使用FakeItEasy。 – DavidS 2013-04-22 11:48:28

+0

'SomeClass'類型是怎麼樣的?你可以更新原始答案嗎?.. – 2013-04-22 12:18:50

+0

如果你使用的是FakeItEasy,只需用'AutoFakeItEasyCustomization'代替'AutoMoqCustomization'。還要注意,提供的示例使用「InlineAutoMockData」(而不是內置的InlineData或InlineAutoData)。 – 2013-04-22 12:23:04