是否可以让 xUnit 创建的 ITestOutputHelper 在 AutoFixture 上下文中可用?

Mic*_*nov 8 c# xunit.net 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())
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ser*_*pin 3

正如 Mark Seemann 在评论中预见到的那样,当前版本 (v2.1) 不支持它,并且没有可见的扩展点。因此,它可能会在未来的版本中添加。

建议牺牲属性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();
  }
}
Run Code Online (Sandbox Code Playgroud)