2017-02-11 104 views
2

是否可以讓xUnit創建的ITestOutputHelper在AutoFixture上下文中可用?是否可以讓由xUnit創建的ITestOutputHelper在AutoFixture上下文中可用?

在我的集成測試中,我使用了Builder類,它包含一些例行操作的輔助方法。爲了隱藏類創建的複雜性,我使用自定義的AutoDataAttribute,因此我的測試從AutoFixture獲取創建的對象作爲測試方法參數。

現在我決定向Builder添加一些日誌記錄功能,但無法找到如何將ITestOutputHelper從自定義AutoDataAttribute傳遞到Builder構造函數中。

using Ploeh.AutoFixture; 
using Ploeh.AutoFixture.AutoNSubstitute; 
using Ploeh.AutoFixture.Xunit2; 
using Xunit; 
using Xunit.Abstractions; 

namespace XunitAutoFixtItestOutput 
{ 
    public class Class1Tests 
    { 
     private readonly ITestOutputHelper _output; 

     public Class1Tests(ITestOutputHelper output) 
     { 
      _output = output; 
     } 

     [Theory, DefaultAutoData] 
     public void UnitOfWork_StateUnderTest_ExpectedBehavior(Builder builder) 
     { 
     } 
    } 

    public class Builder 
    { 
     private readonly ITestOutputHelper _outputHelper; 

     public Builder(ITestOutputHelper outputHelper) 
     { 
      _outputHelper = outputHelper; 
     } 

     public void DoSomething() 
     { 
      _outputHelper.WriteLine("Something happened"); 
     } 
    } 

    public class DefaultAutoData : AutoDataAttribute 
    { 
     public DefaultAutoData() : base(new Fixture().Customize(new DefaultCustomization())) 
     { 
      this.Fixture.Customize<Builder>(f => f.FromFactory(new Builder(??Where to get it from??))); 
     } 
    } 

    public class DefaultCustomization : CompositeCustomization 
    { 
     public DefaultCustomization() : base(new AutoConfiguredNSubstituteCustomization()) 
     { 
     } 
    } 
} 
+2

xUnit.net控制測試類的壽命,以及因爲它會創建傳遞給測試類的構造函數的ITestOutputHelper實例。我沒有完全瞭解xUnit.net的API可以讓你做什麼,但是除非它提供了一個可擴展性點,使得在調用DataAttribute.GetData時可以獲得注入的'ITestOutputHelper',我不認爲這是可能的... –

+0

感謝您的信息,將看看DataAttribute。 –

回答

1

正如馬克·西曼在評論中預見到,它不是在當前版本(V2.1)支持,並沒有可見的擴展點。因此,可能會在future versions中添加。

有一種建議,犧牲AutoData屬性(至少直到的xUnit是延伸)和在測試的構造配置fixture

public class Class1Tests 
{ 
    private readonly Fixture fixture; 

    public Class1Tests(ITestOutputHelper output) 
    { 
    this.fixture = new Fixture(); 
    this.fixture.Inject(output); 
    } 

    [Fact] 
    public void UnitOfWork_StateUnderTest_ExpectedBehavior() 
    { 
    var builder = this.fixture.Create<Builder>(); 
    builder.DoSomething(); 
    } 
} 
相關問題