属性自动生成的固定约束条件

问题描述 投票:2回答:2

我有一个包含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();
c# .net autofixture
2个回答
3
投票

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

这里是一个简单的示例,使用您的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


0
投票

我建议将自定义初始化逻辑与Fixture.Customize<T>()方法一起使用,这为您提供了类型编辑器的实例,并让您为T的属性设置值。这具有将逻辑限制为特定类型的额外好处,这与ElementBuilder不同,后者将为每种类型生成字符。

fixture.Customize<MyType>(composer => composer.With(myType => myType.MyProperty, "[custom value]"));
© www.soinside.com 2019 - 2024. All rights reserved.