2017-02-11 86 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(); 
    } 
} 
相关问题