使用 nUnit 测试 Private 和 Protected 方法

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


Testing Protected Methods

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

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

使用 nUnit 测试 Private 和 Protected 方法 using  System;
使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法
namespace  ClassLibrary1
使用 nUnit 测试 Private 和 Protected 方法
{
使用 nUnit 测试 Private 和 Protected 方法    
/// <summary>
使用 nUnit 测试 Private 和 Protected 方法    
/// Summary description for Class1.
使用 nUnit 测试 Private 和 Protected 方法    
/// </summary>

使用 nUnit 测试 Private 和 Protected 方法    public class Class1
使用 nUnit 测试 Private 和 Protected 方法    
{
使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法        
protected int MyProtectedMethod(int val1, int val2)
使用 nUnit 测试 Private 和 Protected 方法        
{
使用 nUnit 测试 Private 和 Protected 方法            
return val1 + val2;
使用 nUnit 测试 Private 和 Protected 方法        }

使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法    }
 // end of class
使用 nUnit 测试 Private 和 Protected 方法

使用 nUnit 测试 Private 和 Protected 方法}
  //  end of namespace

下面是测试类代码:
使用 nUnit 测试 Private 和 Protected 方法 using  System;
使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法
using  NUnit.Framework;
使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法
namespace  ClassLibrary1
使用 nUnit 测试 Private 和 Protected 方法
{
使用 nUnit 测试 Private 和 Protected 方法    
/// <summary>
使用 nUnit 测试 Private 和 Protected 方法    
/// Summary description for Tester.
使用 nUnit 测试 Private 和 Protected 方法    
/// </summary>

使用 nUnit 测试 Private 和 Protected 方法    [TestFixture]
使用 nUnit 测试 Private 和 Protected 方法    
public class Tester : Class1
使用 nUnit 测试 Private 和 Protected 方法    
{
使用 nUnit 测试 Private 和 Protected 方法        [Test]
使用 nUnit 测试 Private 和 Protected 方法        
public void MyProtectedMethod_Test()
使用 nUnit 测试 Private 和 Protected 方法        
{
使用 nUnit 测试 Private 和 Protected 方法            Assert.AreEqual(
5base.MyProtectedMethod(23));
使用 nUnit 测试 Private 和 Protected 方法        }

使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法    }
 // end of class
使用 nUnit 测试 Private 和 Protected 方法

使用 nUnit 测试 Private 和 Protected 方法}
  //  end of namespace


Testing Private Methods

测试 private 方法需要使用反射

假设要测试下面 ClassLibrary1.Class1 中的 MyPrivateMethod() 方法:
使用 nUnit 测试 Private 和 Protected 方法 using  System;
使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法
namespace  ClassLibrary1
使用 nUnit 测试 Private 和 Protected 方法
{
使用 nUnit 测试 Private 和 Protected 方法    
/// <summary>
使用 nUnit 测试 Private 和 Protected 方法    
/// Summary description for Class1.
使用 nUnit 测试 Private 和 Protected 方法    
/// </summary>

使用 nUnit 测试 Private 和 Protected 方法    public class Class1
使用 nUnit 测试 Private 和 Protected 方法    
{
使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法        
protected int MyPrivateMethod(int val1, int val2)
使用 nUnit 测试 Private 和 Protected 方法        
{
使用 nUnit 测试 Private 和 Protected 方法            
return val1 + val2;
使用 nUnit 测试 Private 和 Protected 方法        }

使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法    }
 // end of class
使用 nUnit 测试 Private 和 Protected 方法

使用 nUnit 测试 Private 和 Protected 方法}
  //  end of namespace

下面是测试类代码:
使用 nUnit 测试 Private 和 Protected 方法 using  System;
使用 nUnit 测试 Private 和 Protected 方法
using  System.Reflection;
使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法
using  NUnit.Framework;
使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法
namespace  ClassLibrary1
使用 nUnit 测试 Private 和 Protected 方法
{
使用 nUnit 测试 Private 和 Protected 方法    
/// <summary>
使用 nUnit 测试 Private 和 Protected 方法    
/// Summary description for Tester.
使用 nUnit 测试 Private 和 Protected 方法    
/// </summary>

使用 nUnit 测试 Private 和 Protected 方法    [TestFixture]
使用 nUnit 测试 Private 和 Protected 方法    
public class Tester
使用 nUnit 测试 Private 和 Protected 方法    
{
使用 nUnit 测试 Private 和 Protected 方法        [Test]
使用 nUnit 测试 Private 和 Protected 方法        
public void MyPrivateMethod_Test()
使用 nUnit 测试 Private 和 Protected 方法        
{
使用 nUnit 测试 Private 和 Protected 方法            ClassLibrary1.Class1 class1 
= new ClassLibrary1.Class1();
使用 nUnit 测试 Private 和 Protected 方法            
object[] aobjParams = new object[] 34 };
使用 nUnit 测试 Private 和 Protected 方法            
object strRet;
使用 nUnit 测试 Private 和 Protected 方法            strRet 
= RunInstanceMethod( typeof(ClassLibrary1.Class1),
使用 nUnit 测试 Private 和 Protected 方法                
"MyPrivateMethod",
使用 nUnit 测试 Private 和 Protected 方法                class1,
使用 nUnit 测试 Private 和 Protected 方法                aobjParams
使用 nUnit 测试 Private 和 Protected 方法            );
使用 nUnit 测试 Private 和 Protected 方法            Assert.AreEqual(
7, strRet.ToString());
使用 nUnit 测试 Private 和 Protected 方法        }

使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法        
/// <summary>
使用 nUnit 测试 Private 和 Protected 方法        
/// 运行静态方法
使用 nUnit 测试 Private 和 Protected 方法        
/// </summary>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="t"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="strMethod"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="aobjParams"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <returns></returns>

使用 nUnit 测试 Private 和 Protected 方法        public static object RunStaticMethod(System.Type t, string strMethod, 
使用 nUnit 测试 Private 和 Protected 方法            
object [] aobjParams) 
使用 nUnit 测试 Private 和 Protected 方法        
{
使用 nUnit 测试 Private 和 Protected 方法            BindingFlags eFlags 
= 
使用 nUnit 测试 Private 和 Protected 方法                BindingFlags.Static 
| BindingFlags.Public | 
使用 nUnit 测试 Private 和 Protected 方法                BindingFlags.NonPublic;
使用 nUnit 测试 Private 和 Protected 方法            
return RunMethod(t, strMethod, 
使用 nUnit 测试 Private 和 Protected 方法                
null, aobjParams, eFlags);
使用 nUnit 测试 Private 和 Protected 方法        }

使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法        
/// <summary>
使用 nUnit 测试 Private 和 Protected 方法        
/// 运行实例方法
使用 nUnit 测试 Private 和 Protected 方法        
/// </summary>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="t"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="strMethod"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="objInstance"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="aobjParams"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <returns></returns>

使用 nUnit 测试 Private 和 Protected 方法        public static object RunInstanceMethod(System.Type t, string strMethod, 
使用 nUnit 测试 Private 和 Protected 方法            
object objInstance, object [] aobjParams) 
使用 nUnit 测试 Private 和 Protected 方法        
{
使用 nUnit 测试 Private 和 Protected 方法            BindingFlags eFlags 
= BindingFlags.Instance | BindingFlags.Public | 
使用 nUnit 测试 Private 和 Protected 方法                BindingFlags.NonPublic;
使用 nUnit 测试 Private 和 Protected 方法            
return RunMethod(t, strMethod, 
使用 nUnit 测试 Private 和 Protected 方法                objInstance, aobjParams, eFlags);
使用 nUnit 测试 Private 和 Protected 方法        }

使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法        
/// <summary>
使用 nUnit 测试 Private 和 Protected 方法        
/// 运行自定义方法
使用 nUnit 测试 Private 和 Protected 方法        
/// </summary>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="t"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="strMethod"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="objInstance"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="aobjParams"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <param name="eFlags"></param>
使用 nUnit 测试 Private 和 Protected 方法        
/// <returns></returns>

使用 nUnit 测试 Private 和 Protected 方法        private static object RunMethod(System.Type t, string 
使用 nUnit 测试 Private 和 Protected 方法            strMethod, 
object objInstance, object [] aobjParams, BindingFlags eFlags) 
使用 nUnit 测试 Private 和 Protected 方法        
{
使用 nUnit 测试 Private 和 Protected 方法            MethodInfo m;
使用 nUnit 测试 Private 和 Protected 方法            
try 
使用 nUnit 测试 Private 和 Protected 方法            
{
使用 nUnit 测试 Private 和 Protected 方法                m 
= t.GetMethod(strMethod, eFlags);
使用 nUnit 测试 Private 和 Protected 方法                
if (m == null)
使用 nUnit 测试 Private 和 Protected 方法                
{
使用 nUnit 测试 Private 和 Protected 方法                    
throw new ArgumentException("There is no method '" + 
使用 nUnit 测试 Private 和 Protected 方法                        strMethod 
+ "' for type '" + t.ToString() + "'.");
使用 nUnit 测试 Private 和 Protected 方法                }

使用 nUnit 测试 Private 和 Protected 方法                                
使用 nUnit 测试 Private 和 Protected 方法                
object objRet = m.Invoke(objInstance, aobjParams);
使用 nUnit 测试 Private 和 Protected 方法                
return objRet;
使用 nUnit 测试 Private 和 Protected 方法            }

使用 nUnit 测试 Private 和 Protected 方法            
catch
使用 nUnit 测试 Private 和 Protected 方法            
{
使用 nUnit 测试 Private 和 Protected 方法                
throw;
使用 nUnit 测试 Private 和 Protected 方法            }

使用 nUnit 测试 Private 和 Protected 方法        }

使用 nUnit 测试 Private 和 Protected 方法
使用 nUnit 测试 Private 和 Protected 方法    }
 // end of class
使用 nUnit 测试 Private 和 Protected 方法

使用 nUnit 测试 Private 和 Protected 方法}
  //  end of namespace





你可能感兴趣的:(protected)