design-patterns - 测试数据生成器是否应该为其非基元构造默认值?

标签 design-patterns c#-3.0 builder-pattern

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

考虑以下构建器:

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 对我很重要,但订单无关紧要,我可以按如下方式创建对象:

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

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

最佳答案

这是一个好主意,被称为 Test Data Builder模式:)

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

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

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

关于design-patterns - 测试数据生成器是否应该为其非基元构造默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2005478/

相关文章:

events - Dojo:主题与事件,应该考虑哪些设计注意事项?

c# - 我可以用来定义同名方法的最佳设计是什么?

c++ - 将任务拆分为类别

只读集合属性的C#对象初始化

java - 如何在我的 ModelInput 类中使用 Joshua Bloch 版本所描述的构建器模式?

java - 类层次结构设计

c# - 我应该用 get 声明我的抽象类的属性吗?放;?

c# - 类型的扩展方法

java - 当类扩展抽象类时如何实现构建器模式

Python,结合长构建器路径和注释