单元测试静态类(理论问题)

时间:2011-09-06 15:02:35

标签: c# unit-testing asp.net-mvc-3 static-classes

我知道什么时候可以使用静态类,但我的简单问题是:

当我们对具有静态类的代码进行单元测试时,是否存在大问题?

最好只使用常规实例类吗?

Thanxs(我知道有一些问题可以谈论这个问题,但所有问题都基于特定情况,我只想对此有一般意见)

1 个答案:

答案 0 :(得分:0)

我所做的是将现有的静态类用作接缝,并在不同的命名空间中提供替代实现。这意味着您可以使用尽可能少的更改来获取正在测试的代码 - 只需更改命名空间。通常我必须这样做才能绕过C#filesystem ops - File.Exists等。

说你的方法基本上是这样的:

using System.IO;

public void SomeMethod()
{
    ...
    if(File.Exists(myFile))
    {
        ...
    }
    ...
}

然后我用替代方案替换File的实现。交替实现应该删除任何现有方法,并调用委托实现的方法 - 例如

namespace IO.Abstractions 
{     
    public static class File
    {         
        public static Func<string, string, string> ExistsImpl =
                                                      System.IO.File.Exists;

        public static string Exists(string path)
        {             
            return ExistsImpl (path);
        }
    }
} 

然后我会修改原始代码,以便它使用新的命名空间:

using IO.Abstractions;

public void SomeMethod()
{
    ...
    if(File.Exists(myFile))
    {
        ...
    }
    ...
}

然后,在您的测试中,您可以为File.Exists提供另一种行为实现,例如:

[Test]
public void SomeTest()
{
    // arrange
    ...
    File.ExistsImpl = (path) => true; // to just default to true for every call
    ...

    // act
    someClass.SomeMethod();

    // then assert
    ...
}

我最近写了一篇博客,其中包含更多细节here