NUnit使用之对Private方法的测试(转)

写了NUnit使用之HelloWorld后,又不知道该写什么了,好像NUnit就这样了.但我们有时又会为测试而抓狂,其实NUnit只是一个工具,写好的单元测试用例要遵循好的设计原则,如:ATRIP.这里就不过多解释了,转入正题.

 

    对Private方法的测试并不是NUnit本身的功能,而是我们通过.net的反射机制执行private方法得到结果,再各期望值进行比较.所以这次要讲的重点在于.net反射的使用.虽然只是其中一点皮毛,但读者应该可以从中对反射有所了解.

    首先定义一个类Calculator,有一个方法Add,实现简单的加法.这个就是我们的被测类.    
      接下来,要对这个类进行测试: 

 
  1. //被测类,实现简单的加法

  2. using System;

  3.  
  4. namespace PrivateMethodTest

  5. {

  6. public class Calculator

  7. {

  8. private int Add(int a, int b)

  9. {

  10. return a + b;

  11. }

  12. }

  13. }

 
  1.  
  2. using System;

  3. using System.Reflection;

  4. using NUnit.Framework;

  5. namespace PrivateMethodTest

  6. {

  7. [TestFixture]

  8. public class CalculatorTest

  9. {

  10. //对Add进行测试

  11. [Test]

  12. public void TestAdd()

  13. {

  14. int expected = 3;

  15. Calculator cal = new Calculator();

  16. object result = InvokePMethod(typeof(PrivateMethodTest.Calculator),"Add",cal,new object[2]{1,2});

  17.  
  18. Assert.AreEqual(expected, result);

  19. }

  20. //辅助方法:调用其他类的私有方法

  21. //InstanceClass:类的实例,Params:方法的参数实例

  22. private object InvokePMethod(System.Type Type, string MethodName, object InstanceClass, object[] Params)

  23. {

  24. //发现方法的属性 (Attribute) 并提供对方法元数据的访问(摘自:MSDN)

  25. //这里方法的属性指方法的static,virtual,final等修饰,方法的参数,方法的返回值等详细信息

  26. //最重要一点是通过MethodInfo可以调用方法(invoke)

  27. MethodInfo Method;

  28. //指定被搜索成员的类型,NonPublic表示搜索非公有成员,Instance表示搜索实例成员(非static)

  29. //所以下面这句表示搜索类型为非公有的实例成员

  30. BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance;

  31. //Type为System.Reflection功能的根,也是访问元数据的主要方式。(摘自:MSDN)

  32. //使用Type的成员获取关于类型声明的信息,如构造函数、方法、字段、属性 (Property)

  33. //和类的事件,以及在其中部署该类的模块和程序集。(摘自:MSDN)

  34. //Type是.net中反射的根源,就如java中的Class类.如果连类都没有,那么调用方法,得到属性,一切都无从入手.

  35. //GetMethod:通过方法名和搜索方式得MethodInfo

  36. Method = Type.GetMethod(MethodName, flags);

  37. //调用private方法:参数分别为类的实例和方法参数

  38. object result = Method.Invoke(InstanceClass, Params);

  39. return result;

  40. }

  41. }

  42. }

重点在于通过反射调用Private方法,得到运行结果,其他与测试Public方法并无二样。使用反射的步骤:

    1.创建实例,Calculator cal = new Calculator()   

    2.得到类型(Type),即typeof(PrivateMethodTest.Calculator),名称空间+类名

    3.得到方法(Method),即Type.GetMethod(MethodName,Flags)

    4.调用方法(Invoke),即object result = Method.Invoke(InstanceClass, Params);

     所以result的值为调用cal中的Add方法,传入两参数1和2得到的结果,再与期望的结果3进行比较.测试通过.

转载自:https://www.cnblogs.com/SunYu/archive/2010/04/30/1724694.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值