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



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

如果有一个大问题,当我们单元测试我们的代码有一些静态类?

是更好的只是使用常规实例类?

谢谢(我知道有一些关于这个的问题,但都是基于特定的情况,我只是想对它有一个总的看法)

我所做的是将现有的静态类使用作为接缝,并在不同的名称空间中提供替代实现。这意味着您可以通过尽可能少的更改(仅更改名称空间)获得测试中的代码。通常,我必须这样做才能绕过c#文件系统ops—File。存在等。

假设你的方法基本上是这样做的:

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提供行为的替代实现。存在,例如:

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

我最近写了一篇博客,在这里有更多的细节。

最新更新