Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过反射调用抽象方法的受保护方法?_C#_.net_Unit Testing_Oop_Reflection - Fatal编程技术网

C# 如何通过反射调用抽象方法的受保护方法?

C# 如何通过反射调用抽象方法的受保护方法?,c#,.net,unit-testing,oop,reflection,C#,.net,Unit Testing,Oop,Reflection,我正试图为一个抽象类编写一个单元测试。更具体地说,我有一个像 public abstract class MyAbstractClass { // ... private Something _myPrivateVariable; // ... protected void MyProtectedMethod(string[] names) { // ... } // ... } 我想用参数调用MyProtectedVoid,然后验证\u myPr

我正试图为一个抽象类编写一个单元测试。更具体地说,我有一个像

public abstract class MyAbstractClass
{
    // ... 
    private Something _myPrivateVariable; 
    // ...
    protected void MyProtectedMethod(string[] names) { // ... }
    // ... 
}
我想用参数调用
MyProtectedVoid
,然后验证
\u myPrivateVariable
是否设置为特定值


我知道如何使用
GetMethod
调用类实例的
private
方法,但是,考虑到我无法创建一个
抽象类的实例,我不知道如何使用
抽象类来执行这类操作。

假设
调用方
是试图从抽象类调用受保护方法的类。在这种情况下,您必须继承抽象类,因为它不允许您创建它的新实例:

public abstract class MyAbstractClass
  {
    // ... 
    private Something _myPrivateVariable; 
    // ...
    protected void MyProtectedMethod(string[] names) { // ... }
    // ... 
  }

public class Caller:MyAbstractClass // inheriting the abstract class
 {
     public void GetAbstractMethod(){
     MyProtectedMethod(/*string[] values*/);
     } 
  }

不能调用不存在的对象的方法,也不能单独创建抽象类

但你实际上是在试图解决一个相当简单的问题。因为您只想测试抽象类的方法,所以可以创建一个从抽象类继承的测试类,并通过测试失败来“实现”任何抽象方法。然后可以使用测试类测试抽象类及其受保护的方法和字段

public class MyAbstractTestClass : MyAbstractClass
{
    public void TestProtectedMethod(string[] names)
    {
        Assert...
        this.MyProtectedMethod(names);
        Assert...
    }
}

这允许您调用例程,允许您访问受保护的方法和字段,并且因为您在单元测试中声明了测试类,所以不会影响其他代码。这种方法甚至可以捕捉到抽象基类在不更新测试代码的情况下发生更改的情况。

您是否尝试过使用Rhinomock对其进行模拟?示例:不应在UT中检查私有变量。查克和其他许多人。