【问题标题】:Fixture Constraints on property autogeneration属性自动生成的夹具约束
【发布时间】:2019-12-05 15:58:11
【问题描述】:

我有一个包含 char 属性的对象。对于我的测试,我需要将该属性设置为除 I 或 R 之外的任何东西。有什么东西可以做,最好是 AutoFixture 原生的,我可以做些什么来获得比我想出的更简洁、更简洁的代码?

这是对象的表示

public class MyObject
{
    public char MyProperty {get; set;}
}

以及我正在使用的解决方案

MyObject = _fixture.Create<MyType>();
if ((new char[] { 'I', 'R' }).Contains(MyObject.MyProperty))
    MyObject.MyProperty = new Generator<char>(_fixture).Where(c => !new char[] { 'I', 'R' }.Contains(c)).First();

【问题讨论】:

  • 如果您只是在寻找工作代码的优化,这似乎是一个代码审查问题。不过可能有点短:)
  • 您可以创建自定义RandomCharSequenceGenerator github.com/AutoFixture/AutoFixture/blob/master/Src/AutoFixture/…,但不会更简洁。所以如果这是你唯一需要它的地方,我不会去的。如果你想要一个例子,请告诉我。

标签: c# .net autofixture


【解决方案1】:

ElementsBuilder 在这里似乎是一个不错的候选人,只要您愿意创建一个可接受字符的 whilelist,而不是黑名单。

这是一个快速示例,使用您的 MyObject 定义。

var fixture = new Fixture();

// A-Z, minus I, R.
fixture.Customizations.Add(new ElementsBuilder<char>("ABCDEFGHJKLMNOPQSTUVWXYZ"));

var createdCharacters = fixture
                .Create<Generator<MyObject>>() 
                .Take(1000)                    
                .Select(f => f.MyProperty)     
                .ToList();          

CollectionAssert.DoesNotContain(createdCharacters, 'I');
CollectionAssert.DoesNotContain(createdCharacters, 'R');

如果您需要比这更多的细微差别(例如,其他对象可以使用 I 或 R 字符),自定义 ISpecimenBuilder 是不错的选择。

【讨论】:

    【解决方案2】:

    我建议使用带有Fixture.Customize&lt;T&gt;() 方法的自定义初始化逻辑,这会为您提供类型编写器的实例,并让您为 T 的属性设置值。这具有将逻辑限制为特定类型的额外好处,不像 ElementBuilder 将为每种类型生成字符。

    fixture.Customize<MyType>(composer => composer.With(myType => myType.MyProperty, "[custom value]"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 2017-09-10
      • 2023-03-18
      • 2020-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-05-21
      相关资源
      最近更新 更多