Как с помощью 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();

Однако никакие автоматически сгенерированные значения не добавляются к свойству Values ​​объектов Entity, как я и ожидал (надеялся...). Я попытался изменить список значений, чтобы он не был доступен только для чтения, и добавить сеттер к свойству Values, что решает проблему, но нет ли лучшей альтернативы этому?


person Lars Michael    schedule 04.08.2014    source источник
comment
см. stackoverflow.com/questions/20808755/   -  person Fabio Marreco    schedule 25.07.2019


Ответы (2)


AutoFixture не заполняет коллекции только для чтения, но вы можете попросить его сделать это:

var entity = fixture.Create<Entity>();
fixture.AddManyTo(entity.Values);
person Mark Seemann    schedule 04.08.2014

Когда я обнаружил это ограничение, я пошел дальше и создал расширение AutoFixture, которое делает именно это: Murph.AutoFixture .AutoReadOnlyCollectionProperties. Также общедоступно на nuget.org.

При построении объекта для любого общедоступного свойства или поля, доступного только для чтения, тип которого реализует ICollection<T>, он будет использовать фикстуру для создания списка T, а затем вызывать метод Add() коллекции для каждого из них. Он будет учитывать настройку OmitAutoProperties прибора, а также предоставляет метод расширения WithoutEx(), который эмулирует встроенный Without() (который не будет работать со свойствами или полями, доступными только для чтения).

Использование так же просто, как и следовало ожидать:

fixture.Customize( new AutoReadOnlyCollectionPropertiesCustomization() );
fixture.Customize< Model >( c => c.WithoutEx( m => m.Collection ) );
person Kurt Hutchinson    schedule 12.11.2017