使用 nUnit 测试 Private 和 Protected 方法

来源:互联网 发布:手机 扫描软件 编辑:程序博客网 时间:2024/06/06 19:33



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
 
原创粉丝点击