C# 与对象初始值设定项相比,测试数据生成器模式有哪些好处?

C# 与对象初始值设定项相比,测试数据生成器模式有哪些好处?,c#,unit-testing,C#,Unit Testing,我一直在读一些支持测试数据构建器模式优点的文章。这似乎是一个好主意,但所有的帖子都已经过时了 当引入C#时,它是否使测试数据生成器模式过时 在初始化对象之前,您需要以下代码来初始化person对象: Person p = new Person("John", "Doe", "555-555-1234"); 当时,如果有一个构建器,就会像这样清理代码: Person person = new PersonBuilder() .WithFirstName("John")

我一直在读一些支持测试数据构建器模式优点的文章。这似乎是一个好主意,但所有的帖子都已经过时了

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

在初始化对象之前,您需要以下代码来初始化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"};

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

以StringBuilder为例。它仍然很有用,并且是构建新字符串所必需的 具有高性能(因为编译器中的优化不会覆盖所有场景)。 其他不可变对象也是如此,正如已经出现的一样

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

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

然而,在一些情况下,建筑商仍然是一个不错的选择

不可变对象就是一个例子。 e、 Jon Skeets protobuff实现是不可变对象的真实世界构建器模式的一个很好的例子。 ()

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


在这种情况下,您可以一次设置多个属性,这样您就可以从某种类型的原型开始,然后继续。例如,在处理不可变对象时,构建器仍然是一个不错的选择。为什么要投票关闭此问题?它写得很好,很有趣,IO。@罗杰拉辛,如果你对这一点进行了扩展,它会是一个很好的答案。@ KE2K:我同意你的观点,但我想有些人会认为它是主观的。如果你的SUT不将这些依赖项暴露为属性,那么你必须直接调用构造函数,这正是您想要避免的。为了扩展第二点,将对象创建委托给专门的工厂和构建者总是明智的(对于松耦合和单元测试而言)。这样,当您开始编写测试时,就可以注入产生mock/stub的工厂。
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();