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

本文关键字:列表 对象 只读 包含 何使用 AutoFixture 自动生成 | 更新日期: 2023-09-27 18:16:32

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

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属性,从而解决了问题,但不是有更好的替代方案吗?

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

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

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

当我发现这个限制时,我继续并创建了一个AutoFixture扩展来做到这一点:murphy .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 ) );