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