Test Data Builder模式相对于Object Initializers有什么好处?

时间:2013-03-22 14:34:58

标签: c# unit-testing

我一直在阅读一堆blog posts,支持测试数据生成器模式的优点。这似乎是一个好主意,但所有帖子都已有数年之久。

当C#引入Object Initializes时,它是否使测试数据生成器模式过时了?

在Object Initializers之前,您需要以下代码来初始化person对象:

Person p = new Person("John", "Doe", "555-555-1234");

当时,拥有一个构建器会像这样清理代码:

Person person = new PersonBuilder()
        .WithFirstName("John")
        .WithLastName("Doe")
        .WithPhoneNumber("555-555-1234");

现在使用对象初始值设定项,它可以看起来像这样,而无需编写任何构建器方法:

Person p = new Person() {FirstName="John", LastName="Doe", Phone="555-555-1234"};

在这个简单的例子中,似乎不需要构建器模式。我错过了什么吗?人们还在使用构建器模式吗?如果是这样,有什么好处?

2 个答案:

答案 0 :(得分:2)

在许多情况下,您可以使用对象初始值设定项替换构建器。

但是,在某些情况下,建造者仍然是一个不错的选择。

不可变对象就是一个例子。 例如Jon Skeets protobuff实现是不可变对象的真实世界构建器模式的一个很好的例子。 (https://codeblog.jonskeet.uk/2008/08/20/lessons-learned-from-protocol-buffers-part-1-messages-builders-and-immutability/

Person john = new Person.Builder()
    .SetFirstName("John")
    .SetLastName("Doe")
    .Build(); //creates an immutable person

其他情况可能是应用预设值。 例如

Rectangle rect = RectangleBuilder.MakeSquare(10).Build();
Car car = CarBuilder.MakeVolvo().PimpIt().SetColor(Color.Red).Build();

在这种情况下,您可以一次设置多个属性,这样您就可以从某种原型开始并从那里继续。

答案 1 :(得分:1)

以StringBuilder为例。为了构建一个新的字符串,它仍然是有用的 具有高性能(因为编译器中的优化不会涵盖所有场景)。 其他不可变对象也是如此,就像已经发表过的那样。

此外,使用构建器模式时,更容易更换初始化类型,这会使您松散耦合(用于依赖注入)。 它可能并不总是需要用于测试目的,但有时可能会派上用场。

相关问题