在C#中为单元测试调整静态类中的常量

时间:2009-07-27 16:42:57

标签: c# unit-testing constants

我有一个静态类,表示我想使用Visual Studio 2008的内置单元测试框架进行单元测试的连接池。静态类中包含一些常量,就像允许的最大连接数一样。我想减少我的单元测试的这个值,所以我不必打开很多连接以达到测试条件(具体来说,是达到最大允许连接的代码)。有没有办法可以在单元测试中编辑这个常量?这对我来说似乎不太可能。

我的一个解决方案是编写另一种方法来访问要测试的代码,一种将“最大允许连接”作为参数。这似乎有点脏,因为它修改了我想要测试的代码,即使只是轻微的;但是,还有更好的选择吗?这是我的一些代码,供参考:

internal static class ConnectionPool<T> where T : Connection, new()
{
    private const int MAX_OBJECTS = 25;
    private static int _totalConnections;

    internal static T getConnection(bool testMode)
    {
        if (_totalConnections >= MAX_OBJECTS)
        {
            // Here's the code I want to test
        }
    }
}

4 个答案:

答案 0 :(得分:2)

不,你不能修改常量,但你可以用静态只读字段替换它,并使用反射修改该字段。

答案 1 :(得分:2)

在你这样做之前,你应该问自己这个限制的重要性,如果改变它,你是否改变了测试的性质?换句话说,如果我将MAX_OBJECTS更改为5,我的代码是否或多或少容易受到资源争用或多线程问题导致的问题的影响?您是否避免测试“真实”条件,因为它太慢或太不切实际?如果是这样,也许最好将其视为不同类别的单元测试。在我工作的地方,我们进行了许多重要但时间成本高昂的测试。如果一直处于停留状态,它们会使持续集成变得不切实际,因此我们创建了NUnit类别“Nightly”,并且测试需要花费超过一分钟的时间必须承担Nightly的Category属性。

答案 2 :(得分:2)

您可以从配置文件中获取它,因此您可以使用不同的值进行测试。

答案 3 :(得分:0)

在我看来,被测试代码的条件有两个部分:常量MAX_OBJECTS是其中之一,为true,但也有_totalConnections。使用Visual Studio为我生成的访问者类可以访问ConnectionPool中的私有方法和变量,我可以修改_totalConnections的值,以使条件if (_totalConnections >= MAX_OBJECTS)成立。换句话说,我将在单元测试中对静态类撒谎,这样我就不必创建MAX_OBJECTS连接以满足条件。