我们应该在类级别或功能级别创建任何类的对象

时间:2014-11-21 04:45:23

标签: unit-testing testing

哪种方法更好:我试图在网上找到它,但我无法得到更好的答案。

1

public class OtherClass
{

    public int Add(int x, int y)
    {
        return x + y;
    }
}  

public class TestClass
{

    OtherClass oClass = new OtherClass();

    public int Fun1()
    {
        return oClass.Add(1,2);
    }

    public int Fun2()
    {
        return oClass.Add(1, 2);
    }
}

2

public class TestClass
{

    public int Fun1()
    {
        OtherClass oClass = new OtherClass();
        return oClass.Add(1, 2);

    }

    public int Fun2()
    {
        OtherClass oClass = new OtherClass();
        return oClass.Add(1, 2);
    }

}

3 个答案:

答案 0 :(得分:2)

我认为这取决于你要测试的内容。

如果您正在测试在同一个类实例上执行的一系列函数的效果,那么您可能想要创建一个单独的实例(例如压力测试)

但是否则我会说在每个测试函数中创建类的新实例总是更好,以确保每个测试的上下文是可预测的。如果您的测试方法共享一个类的实例,并且一个测试方法失败并破坏了测试对象的状态,那么您的后续测试可能会失败,除了被测对象的状态被先前失败的测试损坏之外没有其他原因(可能看起来多个测试都失败了,实际上只有一个早期测试是真正的失败)。

答案 1 :(得分:0)

取决于场景,如果要在多个函数上共享类,并且创建该类的实例不需要特定的参数,那么最好是在类级别。

假设您经常使用 Fun1 Fun2 ,在方法上创建实例会产生实例创建开销而不是在类级别单个实例,或者更好的是,如果您确定它将在整个应用程序中成为单个实例,则将其设置为静态或使其成为单例。

在课堂级别使用它的一个好处是,如果你正在进行单元测试,你可以创建一个像 IOtherClass 这样的界面,并在 TestClass 的构造函数中注入它

它看起来像这样。

public class OtherClass : IOtherClass
{

    public int Add(int x, int y)
    {
        return x + y;
    }
}  

public class TestClass
{

    IOtherClass oClass;

    public TestClass(IOtherClass _oClass)
    {
        oClass = _oClass;
    }

    public int Fun1()
    {
        return oClass.Add(1,2);
    }

    public int Fun2()
    {
        return oClass.Add(1, 2);
    }
}

答案 2 :(得分:-1)

最好将它作为课程中的一个字段,而不是在每个方法中声明一个新字段。原因很简单,每个方法中都没有一行代码声明变量意味着如果声明语句发生变化,你只需要在一个地方改变它,而不是每个方法。此外,它将使您的代码更易于阅读和添加,因为这一行不会在任何地方重复。

请记住,如果需要处理该字段,您的类应该实现IDisposable接口。