使用 nUnit 测试 Private 和 Protected 方法




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(
5 base .MyProtectedMethod( 2 3 ));
        }

    } 
//  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 [] {  3 4  };
            
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
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值