使用 nUnit 测试 Private 和 Protected 方法

原文:http://www.codeproject.com/csharp/TestNonPublicMembers.asp


Testing Protected Methods

要测试一个 protected 方法,我们的测试类需要继承包含这个 protected 方法的父类,然后在测试类中就可以公开使用这个 protected 方法了,示例如下:

假设要测试下面 ClassLibrary1.Class1 中的 MyProtectedMethod() 方法:

using System;

namespace ClassLibrary1
{
    
/// <summary>
    
/// Summary description for Class1.
    
/// </summary>

    public class Class1
    
{

        
protected int MyProtectedMethod(int val1, int val2)
        
{
            
return val1 + val2;
        }


    }
 // end of class

}
 // end of namespace

下面是测试类代码:
using System;

using NUnit.Framework;

namespace ClassLibrary1
{
    
/// <summary>
    
/// Summary description for Tester.
    
/// </summary>

    [TestFixture]
    
public class Tester : Class1
    
{
        [Test]
        
public void MyProtectedMethod_Test()
        
{
            Assert.AreEqual(
5base.MyProtectedMethod(23));
        }


    }
 // end of class

}
 // end of namespace


Testing Private Methods

测试 private 方法需要使用反射

假设要测试下面 ClassLibrary1.Class1 中的 MyPrivateMethod() 方法:
using System;

namespace ClassLibrary1
{
    
/// <summary>
    
/// Summary description for Class1.
    
/// </summary>

    public class Class1
    
{

        
protected int MyPrivateMethod(int val1, int val2)
        
{
            
return val1 + val2;
        }


    }
 // end of class

}
 // end of namespace

下面是测试类代码:
using System;
using System.Reflection;

using NUnit.Framework;

namespace ClassLibrary1
{
    
/// <summary>
    
/// Summary description for Tester.
    
/// </summary>

    [TestFixture]
    
public class Tester
    
{
        [Test]
        
public void MyPrivateMethod_Test()
        
{
            ClassLibrary1.Class1 class1 
= new ClassLibrary1.Class1();
            
object[] aobjParams = new object[] 34 };
            
object strRet;
            strRet 
= RunInstanceMethod( typeof(ClassLibrary1.Class1),
                
"MyPrivateMethod",
                class1,
                aobjParams
            );
            Assert.AreEqual(
7, strRet.ToString());
        }


        
/// <summary>
        
/// 运行静态方法
        
/// </summary>
        
/// <param name="t"></param>
        
/// <param name="strMethod"></param>
        
/// <param name="aobjParams"></param>
        
/// <returns></returns>

        public static object RunStaticMethod(System.Type t, string strMethod, 
            
object [] aobjParams) 
        
{
            BindingFlags eFlags 
= 
                BindingFlags.Static 
| BindingFlags.Public | 
                BindingFlags.NonPublic;
            
return RunMethod(t, strMethod, 
                
null, aobjParams, eFlags);
        }


        
/// <summary>
        
/// 运行实例方法
        
/// </summary>
        
/// <param name="t"></param>
        
/// <param name="strMethod"></param>
        
/// <param name="objInstance"></param>
        
/// <param name="aobjParams"></param>
        
/// <returns></returns>

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


        
/// <summary>
        
/// 运行自定义方法
        
/// </summary>
        
/// <param name="t"></param>
        
/// <param name="strMethod"></param>
        
/// <param name="objInstance"></param>
        
/// <param name="aobjParams"></param>
        
/// <param name="eFlags"></param>
        
/// <returns></returns>

        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 class

}
 // end of namespace





posted @ 2005-08-26 11:01  蛤蟆  阅读(3799)  评论(6编辑  收藏  举报