2

我创建了一个数据构建器,以便在我的单元测试中创建测试数据。我的数据构建器为所有属性创建默认值,以便使用它们的测试只需要指定适用于测试的属性。

考虑以下构建器:

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);
    }
}

通过这样做,如果我需要在 id 对我很重要但 Order 无关紧要的测试中创建客户,我可以按如下方式创建对象:

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

这是一个好主意吗?或者有什么理由认为应该如何构造非原始属性可能不是最好的?

4

1 回答 1

6

这是一个好主意,被称为测试数据构建器模式:)

FWIW,我创建了一个名为AutoFixture的通用测试数据生成器。这将使您能够简单地编写

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

通过使用 AutoFixture,您无需编写和维护大量自定义测试数据构建器,但除此之外,这是一件非常值得的事情。

于 2010-01-05T10:59:47.760 回答