我有一个包含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();
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
。
我建议将自定义初始化逻辑与Fixture.Customize<T>()
方法一起使用,这为您提供了类型编辑器的实例,并让您为T的属性设置值。这具有将逻辑限制为特定类型的额外好处,这与ElementBuilder不同,后者将为每种类型生成字符。
fixture.Customize<MyType>(composer => composer.With(myType => myType.MyProperty, "[custom value]"));