c# - 哪一个在构建构建器时更有效?

标签 c# unit-testing default-value builder

注意:所有构建器仅用于单元测试。

所以我一直在创建构建器,在创建它们的过程中,我开始注意到其他一些已经就位的构建器遵循一些不同的模式。

我想在这里问哪个更有效。

我的做法是这样的:

public class Builder
{
    public Builders()
    {
        SetDefaults();
    }

    private void SetDefaults()
    {
       // Setting my defaults
    }
}

另一种方式是:

public class Builder
{     
    public Builder WithDefaults()
    {
       // Setting my defaults
    }
}

在我看来,第一个更有效,因为您只需创建构建器,它就会自动为您进行默认设置。

在另一种情况下,您必须在继续构建它之前显式调用 WithDefaults 方法来设置所有默认值。

第二个似乎更容易出错,因为一些需要构建的对象如果没有设置所有字段,可能会抛出 null 异常。

也许我在这里漏掉了一些微妙的东西,所以我决定问你哪一个更有效地向前推进。

谢谢。

最佳答案

我想建议第三种选择。由于构建器应该通过以清晰且有意义的方式删除对象初始化来减少测试代码的数量 - 为什么要声明您正在使用默认值? 它本身并没有说明实际的默认值是什么,而且您有测试编写者忘记调用“WithDefaults”的风险。

看看this post for example on how it's done

而是使用构造函数来设置默认值(存储它们的字段),并且只有在明确要求时才更改它们。 这样您就可以通过最少且有意义的构建器调用获得一个已初始化的对象。

关于c# - 哪一个在构建构建器时更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29776078/

相关文章:

c# - Azure Web 作业 : Queue triggers with different batch sizes

javascript - AngularJS 类型错误 : 'undefined' is not an object' Jasmine test

javascript - 如何测试 Jest 没有抛出异常?

javascript - 如何将默认文本添加到 WP 表单中的输入字段

mysql - 如何在 MySql 中将默认值设置为 sysdate?

c# - 在 C# 中,是否有任何神奇的方法可以在不将代码粘贴到各处的情况下从 ~1000 个测试用例函数中检查+提前返回?

c# - 如何让 WebAPI 默认显示 JSON 结果?

c# - Swagger UI 不会使用 [FromBody] 参数列出我的 Post 方法

java - 如何使用 jdb 调试 JUnit 测试用例?

kotlin - Kotlin 中多态函数中的参数定位