Autofixture - базовое свойство в новом списке на свойство из ранее построенного - PullRequest
1 голос
/ 08 марта 2019

Я думаю, что что-то упустил, но я пытаюсь сделать следующее:

У меня есть две базы данных, представленные в моем коде C #. Один является дочерним по отношению к другому, поэтому дочерний элемент содержит поле, которое должно ссылаться на идентификатор родителя.

Родительский класс следующий

public class Product
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }

    public decimal Price { get; set; }

    public decimal DeliveryPrice { get; set; }
}

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

public class ProductOption
{
    public Guid Id { get; set; }

    public Guid ProductId { get; set; }

    public string Name { get; set; }

    public string Description { get; set; }
}

Я создал список случайных «родителей» как таковой:

var products = fixture.CreateMany<Product>(5).ToList();

Затем я хотел создать 10 дочерних объектов и случайным образом дать им ProductId из списка продуктов, созданных AutoFixture. Итак, я попробовал это:

var rand = new Random();
var options = fixture.Build<ProductOption>()
    .With(option => option.ProductId, products[rand.Next(0, 5)].Id)
    .CreateMany(10)
    .ToList();

Это почти сработало, но я обнаружил, что все ProductId были одинаковыми, так что, очевидно, он когда-либо попадал rand.Next только один раз.

То, что я делаю, вообще возможно / желательно?

1 Ответ

3 голосов
/ 08 марта 2019

Когда я предоставляю значение для свойства, я ожидаю, что все экземпляры, построенные с одним и тем же компоновщиком / устройством, будут иметь значение.
Так что вы заметили желаемое поведение.

Вместо уже сгенерированного значения вы можете указать «фабрику», которая будет генерировать значение для свойства во время создания экземпляра.
В последней версии Autofixture появилась перегрузка для метода .With, который принимает функцию в качестве параметра.

var rand = new Random();
Func<Guid> pickProductId = () => products[rand.Next(0, 5)].Id;

var options = 
    fixture.Build<ProductOption>()
           .With(option => option.ProductId, pickProductId)
           .CreateMany(10)
           .ToList();

// Prove
options.Select(o => o.ProductId).ToHashSet().Should().HaveCountGreaterThan(1); // Pass Ok
...