如何使用AutoFixture自动生成包含只读列表的对象?

时间:2014-08-04 15:18:31

标签: c# autofixture

我有一个概念上看起来像这样的课程:

public class Entity
{
    private readonly List<double> _values = new List<double>();

    ...

    public List<double> Values
    {
        get
        {
            return _values;
        }
    }
}

在单元测试中,我想使用AutoFixture提供随机实体列表:

var entities = this.fixture.CreateMany<Entity>().ToList();

但是,没有自动生成的值添加到Entity对象的Values属性中,正如我预期的那样(希望...)。我试图将值列表更改为不是只读,并将一个setter添加到Values属性,这解决了问题,但是不是更好的替代方法吗?

2 个答案:

答案 0 :(得分:3)

AutoFixture不会填充只读集合,但您可以要求它这样做:

var entity = fixture.Create<Entity>();
fixture.AddManyTo(entity.Values);

答案 1 :(得分:1)

当我发现这个限制时,我继续创建了一个AutoFixture扩展来做到这一点:Murph.AutoFixture.AutoReadOnlyCollectionProperties。也可在nuget.org公开发布。

在构建对象时,对于任何类型实现ICollection<T>的公共,只读属性或字段,它将使用fixture创建T列表,然后调用集合的Add()方法每一个。它将遵循fixture OmitAutoProperties设置,并提供一种扩展方法WithoutEx(),它模拟内置Without()(不适用于只读属性或字段)。

用法非常简单:

fixture.Customize( new AutoReadOnlyCollectionPropertiesCustomization() );
fixture.Customize< Model >( c => c.WithoutEx( m => m.Collection ) );