享受代码,享受人生

SOA is an integration solution. SOA is message oriented first.
The Key character of SOA is loosely coupled. SOA is enriched
by creating composite apps.
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

assertThat --- XUnit改进

Posted on 2005-05-15 20:38  idior  阅读(3350)  评论(9编辑  收藏  举报
厌烦了assert.AreEqal();等等一堆的assert方法了吗? 偶然觅得下面这个奇思妙想
看看下面这个:    
 
assertThat(something, eq("Hello"));
assertThat(something, eq(
true));
assertThat(something, isA(Color.
class));
assertThat(something, contains(
"World"));
assertThat(something, same(Food.CHEESE));
assertThat(something, NULL);
assertThat(something, NOT_NULL);
 
第二个参数是一个constraint对象.也就是你对something所要检查的约束.

这个功能实在很cool.

1. 没有了那么多的assert方法,看上去很舒服,也更容易理解.

2. 可以方便的组合约束
     
assertThat(something, not(eq("Hello")));
assertThat(something, not(contains(
"Cheese")));

3. 自定义约束.  
  
  assertThat(something, between(1020)); 
        
public Constraint between(final int min, final int max) {
           
return new Constraint() {  
             
public boolean eval(Object object{
               
if (!object instanceof Integer) {
                  
return false;
               }

               
int value = ((Integer)object).intValue();
               
return value > min && value < max;
             }

           }

        }

    
   其实这里面也就是个责任分离的思想.为啥我们想不到? 当然放到Nunit中, 这个constraint可以通过Delegate来实现. 自己模拟了一下NUnit下的实现, 不知有没有更好的实现?
using System;

namespace xnUnit
{

    
class Constraint
    
{
        
public delegate bool EvalDelegate(object obj);

        
public EvalDelegate EvalHandle; 

        
public bool Eval(object obj)
        
{
            
return EvalHandle(obj);
        }

    }

   
    
class Assert
    
{
        
public static void AssertThat(object obj,Constraint con)
        
{
            
if (con.Eval(obj))
            
{
                Console.WriteLine(
"Pass");
            }

            
else
            
{
                Console.WriteLine(
"Failed!");
            }

        }

    }

}


using System;


namespace xnUnit
{
    
class Program
    
{
        
public static Constraint Between(int min, int max)
        
{
            Constraint con 
= new Constraint();
            con.EvalHandle 
= delegate(object obj)
                            
{
                                
int value = Convert.ToInt32(obj);
                                
return value > min && value < max;
                            }
;
            
return con;
        }


        
static void Main(string[] args)
        
{
            Assert.AssertThat(
3, Between(24));
        }

    }

}