RhinoMock入门(3)——4种Mock类型

做者: 梅桦 发表于 2010-05-10 11:15 原文连接 阅读: 143 评论: 1html

MockRespository有四种泛型方法:程序员

·CreateMock测试

·CreateDynamicMock网站

·PartialMockspa

·Stubcode

3.5中,三种已通过时的方法分别由如下方法替代:orm

·StrictMock视频

·DynamicMockhtm

·PartialMock对象

·Stub

它们各自对应静态工厂方法:

·MockRepository.GenerateStrictMock

·MockRepository.GenerateMock

·MockRepository.GeneratePartialMock

·MockRepository.GenerateStub 

 

1StrictMock

经过这个方法能够建立一个具备严格语义的T类型mock对象,若是在使用过程当中没有显式的对过程进行录制,则会出错误,并会抛出异常。

例如:

[Test]
public   void  TestStrictMock()
{
    MockRepository mocks 
=   new  MockRepository();
    ICustomer customer 
=  mocks.StrictMock < ICustomer > ();

    customer.Replay();
    customer.ShowTitle(
"" );
    mocks.VerifyAll();
}

  

这里没有对customerShowTitle方法显式地安装指望, mock对象又是具备严格语义的对象,因此这里会发生错误,而抛出异常。 

2DynamicMock

经过这个方法能够建立一个具备动态语义的T类型mock对象,若是在使用过种中没有显式的对过程进行录制,则不会出现异常。若是方法有返回值,那么会返回null0

一样以上个例子来讲:

public   void  TestDynamicMock()
{
    MockRepository mocks 
=   new  MockRepository();
    ICustomer customer 
=  mocks.DynamicMock < ICustomer > ();

    customer.Replay();
    customer.ShowTitle(
"" );
    mocks.VerifyAll();    
}

  

这里一样没有进行显式的安装指望,但不会出现错误,不会抛出异常。因此当使用动态语义模拟对象时,没有显式安装指望的方法会被忽略。 

3PartialMock

能够模拟类的一部分。能够独立测试抽象方法。它只能用于类。加一官方描述的话:若是方法上没有设置指望的值,就从一个调用类方法的默认类上去建立一个Mock对象。

如今用例子来讲明一下,这个例子经过抽象类来进行,抽象类中有一模板方法,而其中的方法是个抽象的,这里经过官网提供的例子来进行:

 

public   abstract   class  ProcessorBase
{
    
public   int  Register;
    
public   virtual   int  Inc()
    {
      Register 
=  Add( 1 );
      
return  Register;
    }
    
public   abstract   int  Add( int  i);
}

  

[Test]
public   void  TestPartialMock()
{
    MockRepository mocks 
=   new  MockRepository();
    ProcessorBase proc 
=  mocks.PartialMock < ProcessorBase > ();
    
using  (mocks.Record())
    {
        Expect.Call(proc.Add(
1 )).Return( 1 );
        Expect.Call(proc.Add(
1 )).Return( 2 );
    }   

    proc.Inc();
    Assert.AreEqual(
1 , proc.Register);

    proc.Inc();
    Assert.AreEqual(
2 , proc.Register);

    mocks.VerifyAll();
}

  

4Stub

直接以例子进行

public   interface  IAnimal
{
    
int  Legs {  get set ; }
    
int  Eyes {  get set ; }
    
string  Name {  get set ; }
    
string  Species {  get set ; }
    
event  EventHandler Hungry;
    
string  GetMood();
}

public   class  AnimalTest
{

   IAnimal _animal;
   
public  AnimalTest(IAnimal animal)
   {
       _animal 
=  animal;
   }

   
public   void  SetLegs( int  count)
   {
       _animal.Legs 
=  count;
   }
}

  

测试:

[Test]
public   void  CreateAnimalStub()
{

    MockRepository mocks 
=   new  MockRepository();
    IAnimal animal 
=  mocks.DynamicMock < IAnimal > ();

    Expect.Call(animal.Legs).PropertyBehavior();
    Expect.Call(animal.Eyes).PropertyBehavior();
    Expect.Call(animal.Name).PropertyBehavior();
    Expect.Call(animal.Species).PropertyBehavior(); 

    AnimalTest aa 
=   new  AnimalTest(animal);
    aa.SetLegs(
10 );

    Assert.AreEqual(
10 , animal.Legs);
}

  

设置接口属性行为,能够在实例中使用。这个属性行为能够经过Stub来设置,那就简单了:

[Test]
public   void  CreateAnimalStub()
{
    MockRepository mocks 
=   new  MockRepository();
    IAnimal animal 
=  mocks.Stub < IAnimal > (); 

    AnimalTest aa 
=   new  AnimalTest(animal);
    aa.SetLegs(
10 );
    Assert.AreEqual(
10 , animal.Legs);
}

  

固然,也可利用反射来封装对象属性行为设置mock对象的全部属性:

public   void  SetPropertyBehaviorOnAllProperties( object  mock)
{
    PropertyInfo[] properties 
=  mock.GetType().GetProperties();
    
foreach  (PropertyInfo property  in  properties)
    {
       
if (property.CanRead  &&  property.CanWrite)
       {
          property.GetValue(mock, 
null );
          LastCall.On(mock).PropertyBehavior();
       }
    }
}

  

从这里看出Stub是多么的方便。 

评论: 1 查看评论 发表评论

程序员找工做,就在博客园

最新新闻:
· 电子商务网站之信任度(2010-10-09 17:02)
· 马云:管理的核心在于“抓住人性的本真”(2010-10-09 16:52)
· 另外一 Windows Phone Live 主页截图现身 Windows Phone 7 视频(2010-10-09 16:38)
· 谷歌首名员工:公司成功归结于运气不错(2010-10-09 16:32)
· 神奇小子Geohot带着“limera1n”回归(2010-10-09 16:29)

编辑推荐:远离.NET

网站导航:博客园首页  我的主页  新闻  闪存  小组  博问  社区  知识库

相关文章
相关标签/搜索