Как получить разные даты (гггг-мм-дд) с помощью AutoFixture - PullRequest
2 голосов
/ 08 ноября 2019

У меня есть тестовый пример, в котором мне нужно 4 разных даты для создания моих объектов. Все, что я обнаружил, говорит о том, что AutoFixture всегда генерирует уникальные элементы, но дело в том, что когда он генерирует даты, он делает это, считая все до отметок. В результате, когда я делаю .ToShortDateString() для результата, я могу получить дублированные результаты.

Я знаю, что могу зацикливаться, пока не получу только отдельные значения, но это не будет правильным.

Пока что у меня есть:

string[] dates;
do
{
  dates = _fixture.CreateMany<DateTime>(4).Select(d => d.ToShortDateString()).ToArray();
} while (dates.Distinct().Count() != 4);

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Как упомянуто @MarkSeeman в этом посте о числах

В настоящее время AutoFixture стремится создавать уникальные числа, но не гарантирует этого. Например, вы можете исчерпать диапазон, что, скорее всего, произойдет для байтовых значений [...]

Если для тестового примера важно, чтобы числа были уникальными, я бы рекомендовал сделать это явным в тесте. само дело. Вы можете комбинировать Generator с Distinct для этого

Так что для этой конкретной ситуации я теперь использую

string[] dates = new Generator<DateTime>(_fixture)
                     .Select(x => x.ToShortDateString())
                     .Distinct()
                     .Take(4).ToArray();
1 голос
/ 08 ноября 2019

Вы можете сгенерировать уникальные целые числа (скажем, дни), а затем добавить их к некоторой минимальной дате:

var minDate = _fixture.Create<DateTime>().Date;
var dates = _fixture.CreateMany<int>(4).Select(i => minDate.AddDays(i)).ToArray();

Но я не уверен, что AutoFixture гарантирует, что все сгенерированные значения будут уникальными (см. этот выпуск например)

...