AutoFixure Fixture.Build (). With () с разными значениями - PullRequest
0 голосов
/ 31 мая 2019

Рассмотрим класс

class A
{
    public class NestedA
    {
        public string StrWithInt { get; set; }

        public string Str1 { get; set; }

        public string Str2 { get; set; }
    }

    public List<NestedA> Items { get; set; }
}

Я использую фреймворк AutoFixture для генерации экземпляров класса A со случайным содержимым.
Свойство класса NestedA StrWithInt имеет тип string, но его значение должно быть числом, значением типа int.Поэтому я использую метод With () для настройки генерации.

Мой код выглядит следующим образом:

Random r = new Random();
Fixture fixture = new Fixture();
fixture.Customize<A.NestedA>(ob =>
    ob.With(p => p.StrWithInt, r.Next().ToString())
);
var sut = fixture.Build<A>().Create();

foreach (var it in sut.Items)
{
   Console.WriteLine($"StrWithInt: {it.StrWithInt}");
}
Console.ReadLine();

Я получаю такой результат.

StrWithInt: 340189285
StrWithInt: 340189285
StrWithInt: 340189285

Все значения одинаковы.Но я ожидаю увидеть разные значения этого свойства.
Как я могу добраться до него?

1 Ответ

0 голосов
/ 31 мая 2019

Метод With(...) имеет много перегрузок, среди которых вы можете найти следующие:

IPostprocessComposer<T> With<TProperty>(
      Expression<Func<T, TProperty>> propertyPicker,
      Func<TProperty> valueFactory);

Таким образом, вы можете использовать это через передачу фабрики случайных чисел, и после этого результат всегда будет другим:

fixture.Customize<A.NestedA>(ob =>
    ob.With(p => p.StrWithInt, () => r.Next().ToString())
);

В вашем случае вы выбираете статический, который всегда присваивает одно и то же значение указанному свойству.

...