属性自动生成的夹具约束

bkq*_*kqc 5 .net c# autofixture

我有一个包含 char 属性的对象。对于我的测试,我需要将该属性设置为除 I 或 R 之外的任何内容。是否有任何东西,理想情况下是 AutoFixture 原生的,我可以做的比我想出的代码更简洁、更简洁?

这是对象的表示

public class MyObject
{
    public char MyProperty {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我正在使用的解决方案

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();
Run Code Online (Sandbox Code Playgroud)

Jef*_*yer 5

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

这是一个使用您的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');
Run Code Online (Sandbox Code Playgroud)

如果您需要更多的细微差别(例如,其他对象可以使用 I 或 R 字符),则可以使用自定义ISpecimenBuilder