我已经开始建造一个生成器,让我可以很容易地建立试验数据单元的测试我的写作。

基本结构的建设者是:

public class MyClassBuilder
{
    public int id = 0; //setting the default value here

    //allows MyClass to be built with a specific id
    public MyClassBuilder WithId(int id)
    {
        this.id = id;
        return this;
    }

    public MyClass Build()
    {
        return new MyClass(id);
    }
}

使用这一模式,然后变为:

MyClass mc = new MyClassBuilder().WithId(5).Build();

我舒服的...但在那里我有问题时 MyClass 有一个属性,是不平凡的。...我有点不知怎么去构建它的默认值。

public class MyClassBuilder
{
    public int id = 0; //setting the default value here

    //do I construct the default value using a MySecondClassBuilder?
    public MySecondClass mySecondClass;

    //allows MyClass to be built with a specific id
    public MyClassBuilder WithId(int id)
    {
        this.id = id;
        return this;
    }

    public MyClassBuilder WithMySecondClass(MySecondClass mySecondClass)
    {
        this.mySecondClass = mySecondClass;
    }

    public MyClass Build()
    {
        return new MyClass(id);
    }
}

我的假设是,我会创造一个生成器 MySecondClass 和使用,创建默认的执行情况。

任何人都可以证实,我的假设是正确的,并且是最好的做法吗?

我目前正在测试我的假设,但我想我会的文件这一想法在计算器以来唯一的例子生成器的念叨那个我能找到使用谷歌只有史以来建造的性均值类型和没有参照类型。

有帮助吗?

解决方案

如同大多数的东西-它依赖。

如果你想参考义在mySecondClass领域(即:你要保存一个参考的另一类),那么它就是喜欢你的整数。具有默认的行为可以完全可接受的。

但是,如果你想永远保证的价值,则需要建立或只是建造一个新的对象为你的第二类。

此外,如果你想要的克隆,而不是通过参照的副本,你会需要建立一个新的对象,并将其分配到的参考。

这就是说,在许多情况下,传统构造更适合于在尝试做一个精通建立风格的接口。这真的很容易"乱"一口流利的接口建立这样,因为你是依靠用户超过一个传统构造。

作为一个例子,在你的代码,会发生什么,如果用户从来没有呼吁建立?它仍然是返回的东西(因为每一个方法回返的一个目),但是它有效吗?我不会确保为消费者类。传统构造与重载,另一方面,告诉我究竟是什么有效和什么是不是有效的,并正编写时执行。

其他提示

一旦我拥有一个复杂的目的在哪里我希望有一个虚拟使用的单位测试中,我会一般转到一个嘲讽/伪造/隔离的框架。在C#我的首选是最低采购量,但有几个在那里,像犀牛嘲笑,Typemock等。

利益有,他们通常会有能力根出的所有特性中存在的原始种类型使用默认值和空对象,你有没有做什么比一个单一的线路发言,以创建虚假的对象。在同一时间,可以很容易配置的对象返回值为那些属性,不管你的测试。此外,大多数这样的框架支持伪造递归,使得复杂的物体内的类型也将获得伪造,等等。

是有原因为什么一个人可能不希望使用一个单独的框架,在这种情况下,我认为Reed Copsey的建议将手册的方式来做到这一点。

如果没有任何原因,以避免增加一个模拟测试框架(这将只是一个依赖于你的试验项目,假设你已经拆分测试),我衷心地推荐这对于复杂的类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top