Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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# PrivateObject找不到属性_C#_.net_Unit Testing_Mstest - Fatal编程技术网

C# PrivateObject找不到属性

C# PrivateObject找不到属性,c#,.net,unit-testing,mstest,C#,.net,Unit Testing,Mstest,我的结构基本上是这样的: abstract class A { protected string Identificator { get; set; } private void DoSomething() { // ... DoSomethingSpecific(); } protected abstract void DoSomethingSpecific(); } 由于复杂性,我需要对DoSomething方法进行单元测试

我的结构基本上是这样的:

abstract class A
{
   protected string Identificator { get; set; }

   private void DoSomething()
   {

       // ...

       DoSomethingSpecific();
   }

   protected abstract void DoSomethingSpecific();
}
由于复杂性,我需要对DoSomething方法进行单元测试,以确保它以相同的方式工作。这就是我创建以下存根的原因

public class AStub : A
{
    protected override void DoSomethingSpecific()
    {
        // nothing to do
    }
}
我使用PrivateObject类来访问类A的方法和属性,以便实例化类AStub。这工作了一段时间,由于某种原因,现在每当我尝试访问属性或方法时就会崩溃

以下代码用于测试:

var sut = new CommonIodAdapterImpl();
var accessor = new PrivateObject(sut);

accessor.SetProperty("Identificator", "blablub");
accessor.Invoke("DoSomething", null);

// assert...
引发的异常是MissingMethodException,它告诉我未找到属性或方法。但当我调试和检查层次结构时,似乎每个层次结构都是正确的,包括拼写

谢谢你的帮助。

那不应该是“公共课A”吗

要解决缺少的方法异常,只需再次编译所有内容(!)。要么你得到一些编译器错误告诉你什么是错误的,要么错误将消失


如果它仍然不起作用,请检查您是否没有程序集的多个副本(包括GAC!),并在DebougOut窗口中观察它是否从正确的路径加载程序集。

我刚刚尝试了类似的方法,我认为这是因为该属性受保护而不是私有的

我在测试程序集中创建了自己的访问器

public class AAccessor : A
{
    // use this instead of Identificator
    public string IdentificatorAccessor 
    {
        get { return this.Identificator; }
        set { this.Identificator = value; }
    }

    // test this method in your unit test
    public void DoSomethingAccessor()
    {
        this.DoSomethingSpecific()
    }

    // need this to satisfy the abstract class
    protected override void DoSomethingSpecific()
    {
        // do nothing here
    }
}

您需要将PrivateType参数设置为基类以访问该级别的私有成员

var accessor = new PrivateObject(sut, new PrivateType(typeof(A)));

我们是否可以假设,
AStub
不是从
A
继承的事实是问题中代码示例中的一个输入错误,并且它应该是
公共类AStub:A
?对不起,你是对的,我遗漏了一些东西……那么你没有真正从“A”继承的问题也是如此在您的代码中,或者您是否以其他方式解决了此问题?在“测试代码”中,
new commoniodapterimpl()
是否应该是
new AStub()
,提供有关此代码为什么和/或如何回答此问题的附加上下文可以提高其长期价值。本质上,此代码的关键是在PrivateObject()中声明类型。创建PrivateObject()时,它默认为从中创建它的类的类型。因此,在上述情况下,PrivateObject()只会创建类型为DeriverdClass()的PrivateObject,但当您指定PrivateObject的类型为BaseClass时,它现在知道要创建BaseClass类型的PrivateObject。
public class BaseClass
{
   private int _fieldToSet;
   ...
}

public class DerivedClass : BaseClass
{
   ...
}

// Unit Test Code

public void Test()
{
   DerivedClass d = new DerivedClass();
   PrivateObject privObj = new PrivateObject(d, new PrivateType(typeof(BaseClass));
   privObj.SetFieldOrProperty("fieldToSet", 8675309);
   ...
}