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

網站導航:博客園首頁  我的主頁  新聞  閃存  小組  博問  社區  知識庫

相關文章
相關標籤/搜索