我的结构基本上看起来像这样:
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,告诉我找不到属性或方法。但是当我调试并检查层次结构时,每个似乎都是正确的拼写错误。
感谢您的帮助。
答案 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);
...
}