使用 nUnit 测试 Private 和 Protected 方法

要测试一个 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

你可能感兴趣的:(protected)