6

当我开发代码时,我经常想对一个类的一些构建块进行单元测试,即使它们通常是私有的。如果我的单元测试在项目内部,我可以使用“朋友”来完成此操作,并且仍然保持功能私有以供正常使用。但我宁愿将我的 NUnit 测试转移到他们自己的单独项目中。如何达到我想要的效果?

4

3 回答 3

11

您不能(轻松)测试来自不同项目的私有方法,但是使用. 这使得成员可以访问另一个程序集。FriendInternalsVisibleToAttributeFriend

显然这是 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 回答