如何使用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不填充只读集合,但您可以要求它这样做:
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 ) );