PrivateObject找不到属性

时间:2011-02-03 08:46:12

标签: c# .net unit-testing mstest

我的结构基本上看起来像这样:

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,告诉我找不到属性或方法。但是当我调试并检查层次结构时,每个似乎都是正确的拼写错误。

感谢您的帮助。

4 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:1)

不应该是“公共类AStub:A”吗?

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

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

答案 2 :(得分:1)

我只是尝试了类似的东西,我认为这是因为该属性受到保护而非私有。

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

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
    }
}

答案 3 :(得分:0)

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);
   ...
}