Должен ли конструктор тестовых данных создавать значения по умолчанию для непримитивов?


Я создал конструктор данных для создания тестовых данных в модульных тестах. Мои построители данных создают значения по умолчанию для всех свойств, так что тестам, использующим их, нужно только указать свойства, применимые к тесту.

Рассмотрим следующий конструктор:

public class CustomerBuilder
{
    public int id = 0;
    public Order order = new OrderBuilder().Build();

    public CustomerBuilder WithId(int id)
    {
        this.id = id;
        return this;
    }

    public CustomerBuilder WithOrder(Order order)
    {
        this.order = order;
        return this;
    }

    public Customer Build()
    {
        return new Customer(id, order);
    }
}

Таким образом, если мне нужно создать клиента в тесте, в котором идентификатор важен для меня, но заказ не имеет значения, я могу создать объект следующим образом:

Customer c = new CustomerBuilder()
                  .WithId(99)
                  .Build();

Это хорошая идея? Или есть есть ли какая-то причина, по которой не было бы лучше предположить, как должно быть построено непримитивное свойство?

1 2

1 ответ:

Это прекрасная идея и известна как конструктор тестовых данных шаблон:)

FWIW, я создал универсальный конструктор тестовых данных под названиемAutoFixture . Это позволит вам просто написать

var customer = new Fixture()
    .Build<Customer>()
    .With(c => c.Id, 99)
    .CreateAnonymous();

С помощью AutoFixture вам не нужно писать и поддерживать множество пользовательских построителей тестовых данных, но в остальном это очень стоящая вещь.