AutoFixture build collection с уникальным свойством - PullRequest
1 голос
/ 26 марта 2019

Есть ли возможность создать коллекцию с уникальным свойством в AutoFixture? Например, я хотел бы создать коллекцию:

public class Foo {
 public int Id {get; set;}
 public string Name {get;set;}
}

с уникальным Id. Это будет выглядеть примерно так:

var fixture = new Fixture();

fixture
 .Build<Foo>()
 .WithUnique((foo) => foo.Id)
 .CreateMany(20);

Я знаю, что это можно сделать с помощью настройки, но я думаю, что это довольно распространенный сценарий, так что, возможно, AutoFixture что-то готово для этого?

1 Ответ

1 голос
/ 26 марта 2019

Автофиксатор по умолчанию генерирует уникальные значения для свойств. Поэтому вам не нужно указывать, какое свойство должно быть уникальным - вместо этого укажите неуникальное значение для другого свойства:

// with AutoFixture.SeedExtensions
fixture.Build<Foo>().With(f => f.Name, fixture.Create("Name")).CreateMany(20)

Обратите внимание: если вы хотите обеспечить неуникальные значения для других свойств (имеющих только Id уникальные), вы можете создать простые расширения для IPostprocessComposer, которые предоставляют набор возможных значений для свойства:

public static IPostprocessComposer<T> With<T, TProperty>(
    this IPostprocessComposer<T> composer,
    Expression<Func<T, TProperty>> propertyPicker,
    IEnumerable<TProperty> possibleValues) =>
      composer.With(propertyPicker, possibleValues.ToArray());

public static IPostprocessComposer<T> With<T, TProperty>(
    this IPostprocessComposer<T> composer,
    Expression<Func<T, TProperty>> propertyPicker,
    params TProperty[] possibleValues)
{
    var rnd = new Random();
    return composer.With(
       propertyPicker,
       () => possibleValues[rnd.Next(0, possibleValues.Length)]);
}

Использование простое - следующий код создает список foos с двумя разными значениями имени и тремя разными значениями для целочисленного свойства:

fixture.Build<Foo>()
    .With(f => f.SomeIntegerProperty, 10, 20, 50)
    .With(f => f.Name, fixture.CreateMany<string>(2))
    .CreateMany(20);
...