C# 单元测试心得

1.    这里讨论的单元指一个类,测试的内容为类中的方法。
比如:我们有下面这个类

namespace SimpleMath
{
 class Caculator
{
public Caculator
{
}

// add 
public int Add(int a, int b,ref bool res)
{
     int  c=0;
   try
   {
       checked(c=a+b);
        res = true;
    }
    catch
      {
        res = false;
      }
    return c;    
 }

//division
private float Div(float a, float b,ref bool res)
{
     float  c=0.0SF;
   try
   {
       checked(c=a/b);
        res = true;
    }
    catch
      {
        res = false;
      }
    return c;    
 }

}
}


目的:测试Caculator类是否正常,其实就是测试类中的两个方法是否正常。
这个例子只是为了说明测试方法。

首先看看怎么测试公有的Div方法。

一.    在名字空间SimpleMath中添加一个测试类。(我们用Nunit工具测试)
[TestFixture]
class TestDiv
{
 
[Test]
 public void TestCase1()
 {
   Caculator C = new Caculator();
   bool result = false;
   
   C.Div(100,0,ref result);
   
   Assert.Isfalse(result);
 }
}
优点:操作很方便,代码简洁。
缺点:对大型项目,发布的时候要删除测试类(开发和测试混合在同一个项目中)。

二.    添加一个测试项目。引用要测试的类的dll 文件。
 
 优点:测试项目和开发项目分开,便于管理。
 缺点:有些类没有生成为dll文件,比如表示层的类。这样就不能测试那些类。

因此两种方法各有所长,可以根据情况综合应用。

两种方法都没有解决一个问题:怎么测试类中的私有方法?
虽然这种情况并不多见,因为类中的方法不向外公开就没什么意思了,私有的方法只能被类中的其他方法访问,我们测试调用该私有方法的公有方法就行了,一般情况确实如此。如果我们一定要测试私有方法呢?有些时候的确需要测试。

解决此问题的关键就是:反射


比如有这样一个类:
class Sample
    {
        private int TT(int p)
        {
            return p;
        }
}


测试

using pp;
Assembly A = Assembly.LoadFrom("E:\\CSProg\\pp\\bin\\Debug\\pp.dll");
Type T = typeof(Sample);
        
MethodInfo f = T.GetMethod("TT",BindingFlags.NonPublic|BindingFlags.Instance|BindingFlags.InvokeMethod);

Sample S = new Sample();
int b = (int)(f2.Invoke(S,new object[]{(int)9}) );

通过反射获取私有方法,就能测试私有方法了。

问题:私有方法中的ref 参数怎么传递进去呢? 这个问题我还没解决,有解决办法请共享,不胜感激! 
yuzhigang84@gmail.com