PrivateObject找不到属性

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

abstract class A { protected string Identificator { get; set; } private void DoSomething() { // ... DoSomethingSpecific(); } protected abstract void DoSomethingSpecific(); } 

由于我需要的复杂性,我们需要对DoSomething方法进行unit testing,以确保它以相同的方式运行。 这就是我创建以下存根的原因。

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

引发的exception是MissingMethodException,告诉我没有找到属性或方法。 但是,当我调试并检查层次结构时,每个似乎都是正确的包含拼写。

谢谢您的帮助。

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

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

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

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

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

我只是尝试了类似的东西,我认为这是因为财产受到保护而不是私有。

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

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