【问题标题】:AutoFixture multiple customization wont workAutoFixture 多重定制不起作用
【发布时间】:2022-12-14 00:09:06
【问题描述】:

AutoFixture 不适用于注册和其他自定义调用。如果我只做两者之一,它就会起作用。自定义功能的整个行为对我来说很难理解。这是按设计工作的吗?

目标:对特殊类使用最贪婪的构造函数和OmitAutoProperties

public interface IDataProvider { }
public class FileDataProvider : IDataProvider {}
public class TestClass
{
      public TestClass() : this (new FileDataProvider()) { }
      public TestClass(IDataProvider dataProvider) { } // should be used from AutoFixture
}

[Fact]
public void Method_State_Result()
{
      var fixture = new Fixture();

      fixture.Register(() => fixture.Build<DocumentClient>().OmitAutoProperties().Create());
      var dc1 = fixture.Create<DocumentClient>(); // working

      fixture.Customize(new AutoNSubstituteCustomization());
      fixture.Customizations.Add(new MethodInvoker(new GreedyConstructorQuery()));

      var dc2 = fixture.Create<DocumentClient>(); // crash with "AutoFixture was unable to create an instance from System.SByte*, most likely because it has no public constructor, is an abstract or non-public type"
      var dc3 = fixture.Create<TestClass>();
}

解决方法是像这样进行注册。但感觉不是正确的解决方案......

fixture.Register(() => new Fixture().Build<DocumentClient>().OmitAutoProperties().Create());

【问题讨论】:

  • 好问题。我一直想知道这一点。
  • 我已经找到了解决我的问题的方法,但仍然很好奇其他一些解决方案的外观。

标签: c# autofixture


【解决方案1】:

如果我正确理解了这个问题,那么最简单的选择就是提供一个使用样本生成器的自定义工厂。

fixture.Customize<TestClass>(c => c
    .FromFactory(new MethodInvoker(new GreedyConstructorQuery()))
    .OmitAutoProperties());

这是一个示例测试。

public class TestClass
{
    public TestClass() : this(new FileDataProvider())
    {
    }

    public TestClass(IDataProvider dataProvider)
    {
        DataProvider = dataProvider;
    }

    public string SomeString { get; set; }
    public IDataProvider DataProvider { get; }
}

[Fact]
public void FooTest()
{
    var fixture = new Fixture().Customize(new AutoMoqCustomization());
    fixture.Customize<TestClass>(c => c
        .FromFactory(new MethodInvoker(new GreedyConstructorQuery()))
        .OmitAutoProperties());

    var mockProvider = fixture.Freeze<IDataProvider>();
    var testObject = fixture.Create<TestClass>();

    Assert.Null(testObject.SomeString);
    Assert.Same(mockProvider, testObject.DataProvider);
}

【讨论】:

    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2015-04-29
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多