【发布时间】:2013-01-08 11:01:00
【问题描述】:
我正在尝试在单元测试项目中测试私有方法。到目前为止,一切都很好,但是当我必须测试一个带有 out 参数的方法时,我遇到了一个问题。该方法的签名是:
private bool GotSSI(out SSI ssi, RSI rsi)
{
~code omitted~
}
而单元测试(不工作的部分)看起来像这样:
SSI ssi = null;
object[] p = new object[]{ssi,rsi};
Type[] t = new Type[] { typeof(SSI).MakeByRefType(), typeof(RSI) };
actual = (bool) privateTarget.Invoke("GotSSI",t,p);
GotSSI 方法有效。我已经在单元测试中以调试模式对其进行了测试,我可以看到在方法内部设置了“ssi”输出变量,然后返回它的真值或假值。但是当测试返回到它自己的代码时,“ssi”变量仍然为空。所以问题是我在“GotSSI”方法中创建的对象,并没有从 PrivateObject 调用方法中解析出来。
有人知道我错过了什么吗?
更新(Rafal 的解决方案)
Rafal 的解决方案完美运行,这就是我实施该解决方案的方式。
我创建了一个委托:
delegate bool GotSSIInternal(out SSI ssi, RSI rsi);
当我创建了我想测试的对象后,我构建了委托(目标是我正在测试的对象):
GotSSIInternal gotSSIInternal = (GotSSIInternal) Delegate.CreateDelegate(
typeof (GotSSIInternal),
target,
typeof(OfflineResolver).GetMethod("GotSSI", BindingFlags.NonPublic | BindingFlags.Instance));
之后调用委托就很简单了:
actual = gotSSIInternal.Invoke(out ssi, rsi);
解决方案非常简单,效果很好。
【问题讨论】:
-
定义一个帮助类来为你制作这些可能是有意义的: internal static T MakeDelegate
(string methodName, T target){ return (T)Delegate.CreateDelegate(typeof(T ), target, typeof(C).GetMethod(methodName, BindingFlags.NonPublic | BindingFlags.Instance));} 但也许你已经想到了。 :-) -
并非如此。只有一个测试有这个问题,而且我面临时间压力。一个好主意。
标签: c# unit-testing