当我开发代码时,我经常想对一个类的一些构建块进行单元测试,即使它们通常是私有的。如果我的单元测试在项目内部,我可以使用“朋友”来完成此操作,并且仍然保持功能私有以供正常使用。但我宁愿将我的 NUnit 测试转移到他们自己的单独项目中。如何达到我想要的效果?
问问题
3142 次
3 回答
11
您不能(轻松)测试来自不同项目的私有方法,但是使用. 这使得成员可以访问另一个程序集。Friend
InternalsVisibleToAttribute
Friend
显然这是 VB 9 中的新功能,尽管它在 C# 2 中可用......不太清楚为什么,但Bart de Smet 的这篇博客文章给出了一个简单的例子。
请注意,如果您的生产程序集已签名,则您的测试程序集也需要签名,并且您必须在InternalsVisibleToAttribute
参数中指定公钥。有关更多详细信息,请参阅此 Stack Overflow 答案。
于 2009-03-15T21:33:08.070 回答
3
您可以使用反射来调用私有方法。有很多样本可以做到这一点。
于 2009-03-15T22:03:48.260 回答
1
从谷歌快速搜索: http: //www.codeproject.com/KB/cs/testnonpublicmembers.aspx
基础知识:(这是从上面链接的代码项目站点粘贴的)
public static object RunStaticMethod(System.Type t, string strMethod,
object [] objParams)
{
BindingFlags eFlags =
BindingFlags.Static | BindingFlags.Public |
BindingFlags.NonPublic;
return RunMethod(t, strMethod,
null, aobjParams, eFlags);
} //end of method
public static object RunInstanceMethod(System.Type t, string strMethod,
object objInstance, object [] aobjParams)
{
BindingFlags eFlags = BindingFlags.Instance | BindingFlags.Public |
BindingFlags.NonPublic;
return RunMethod(t, strMethod,
objInstance, aobjParams, eFlags);
} //end of method
private static object RunMethod(System.Type t, string
strMethod, object objInstance, object [] aobjParams, BindingFlags eFlags)
{
MethodInfo m;
try
{
m = t.GetMethod(strMethod, eFlags);
if (m == null)
{
throw new ArgumentException("There is no method '" +
strMethod + "' for type '" + t.ToString() + "'.");
}
object objRet = m.Invoke(objInstance, aobjParams);
return objRet;
}
catch
{
throw;
}
} //end of method
于 2009-04-17T17:20:07.370 回答