原文: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(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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· 单线程的Redis速度为什么快?
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码