asp.net 如何在c#中调用一个有保护构造函数的类来测试它的方法?

svgewumm  于 12个月前  发布在  .NET
关注(0)|答案(2)|浏览(170)

我有一个如下结构的C#类

public class ClassA{
    protected ClassA(double[] number){
    }
    public double methodofClassA(){
    }
}

字符串
我想调用methodofClassA()对该方法进行单元测试。但是,由于受保护的构造函数,我无法这样做。在遗留代码中,他们使用了访问器。但由于其在最新版本的.NET Framework中被弃用,如何解决这个问题并在删除访问器后测试该方法?
Tia

bttbmeg0

bttbmeg01#

您可以通过继承使CTOR可访问您的测试工具:

using System;
                    
public class Program
{
    public static void Main()
    {
        Console.WriteLine(new TestShim(3.5).ClassAMethod());
    }
}

public class ClassA
{
    private readonly double _value;
    
    protected ClassA( double @value )
    {
        _value = @value;
    }
    
    public double ClassAMethod() { return _value; }
}

public class TestShim : ClassA
{
    public TestShim( double a ) : base(a) {}
}

字符串
See also this Fiddle
由于受保护的CTOR对于继承被测类的类来说是可访问的,所以您所需要做的就是从它派生,并且您应该能够通过这种间接方式执行所有测试。
另一个问题是:你真的需要这样做吗?如果你测试派生类,这个基础应该已经覆盖了很多。

rbpvctlc

rbpvctlc2#

一般来说,你应该测试类的公共API。所以你应该像类的其他用户一样创建类。如果类只打算作为基类,测试派生类。
如果一个类只是一个更大的类的一部分,那么你可能测试错了“单元”。单元测试中的“单元”可以是任何大小,它不一定是一个类。它可以是一些内部紧密耦合的类的集合,或者是一个完整的程序集,如果它有一个足够简单的公共API,或者是一个单一的方法。
也就是说,在某些情况下,你只需要一个实用的解决方案来解决特定的问题。在这种情况下,我倾向于只提供一个明确命名的公共方法。

public class ClassA{
    public static ClassA CreateInstanceForTestingOnly(double[] number) => new (number); 
    protected ClassA(double[] number){
    }
    public double methodofClassA(){
    }
}

字符串
您可以将这些方法设置为internal,并使用InternalsVisibleToAttribute仅将这些方法公开给您的测试程序集。这可能对任何类型的“公共”API特别有用,其中代码可能被外部人员使用。

相关问题