RhinoMock入門(4)——次序和委託

做者: 梅樺 發表於 2010-05-10 15:16 原文連接 閱讀: 82 評論: 0html

(一)次序(Ordered程序員

rhinomock中,能夠按次序調用方法。默認條件下,方法調用沒有順序。若是按次序錄制,那麼在調用方法時必須按錄製時相同的次序進行。測試

 

請看:網站

public   interface  ICustomer
{
   string  ShowTitle( string  str);
   int  Unid {  get set ; }
   string  CustomerName {  get set ; }
   string  Address {  get set ; }
}

 

測試:spa

public   void  TestNoOrder()
{
    MockRepository mocks 
=   new  MockRepository(); 
    ICustomer customer 
=  mocks.StrictMock < ICustomer > (); 

    
// 默認條件下是沒順序的
    Expect.Call(customer.Unid).Return( 1 );
    Expect.Call(customer.CustomerName).Return(
" 宋江 " );
    Expect.Call(customer.Address).Return(
" 山東 " ); 

    mocks.ReplayAll(); 

    Assert.AreEqual(
" 宋江 " , customer.CustomerName);
    Assert.AreEqual(
1 , customer.Unid);
    Assert.AreEqual(
" 山東 " , customer.Address);
}

 

 

當使用次序時:code

public   void  TestOrder()
{
    MockRepository mocks 
=   new  MockRepository(); 
    ICustomer customer 
=  mocks.StrictMock < ICustomer > ();
    
using  (mocks.Ordered())
    {
        Expect.Call(customer.Unid).Return(
1 );
        Expect.Call(customer.CustomerName).Return(
" 宋江 " );
        Expect.Call(customer.Address).Return(
" 山東 " );
    } 

    mocks.ReplayAll();

    Assert.AreEqual(
" 宋江 " , customer.CustomerName);
    Assert.AreEqual(
1 , customer.Unid);
    Assert.AreEqual(
" 山東 " , customer.Address);
}

 

這時,若是調用時沒有定期望時的次序進行,那就會出錯,拋出異常。orm

這種次序能夠靈活使用,例如能夠次序一個mock,而後指望條件達到後,再不按次序進行。注意:在進行回播前要退出次序。視頻

 

(二)模擬委託htm

先定義委託:blog

public   delegate   void  DoThing( string  strMsg);

  

而後模擬委託:

[Test]
public   void  TestDelegate1()
{
    MockRepository mocks 
=   new  MockRepository();
    var oo 
=  mocks.DynamicMock < DoThing > ();
    oo(
"" );
    mocks.ReplayAll();
    oo(
"" );
    mocks.VerifyAll();
}

 

有兩個系統定義的委託FuncAction

前是帶返回值的委託,後者不帶返回值,如今經過Action來實現上例

[Test]
public   void  TestDelegate2()
{
    MockRepository mocks 
=   new  MockRepository();
    var oo 
=  mocks.DynamicMock < Action < string >> ();

    oo(
"" );
    mocks.ReplayAll();
    oo(
"" );
    mocks.VerifyAll();
}

 

再來一個Func,即帶返回值的委託的例子:

[Test]
public   void  TestDelegateFunc()
{
    MockRepository mocks 
=   new  MockRepository();
    var oo 
=  mocks.DynamicMock < Func < string string >> ();

    Expect.Call(oo(
"" )).Return( " abc " );
    mocks.ReplayAll();
    Assert.AreEqual(
" abc " , oo( "" ));
}

  

再來一個例子:

public   class  Customer
{
     Func
< string string >  _fun;
     
public  Customer(Func < string string >  fun)
     {
          _fun 
=  fun;
     }

     
public   void  DoSomething( string  strMsg)
     {
          Console.WriteLine(_fun(strMsg));
     }
}

 

 

測試:

[Test]
public   void  TestDelegateFunc()
{
    MockRepository mocks 
=   new  MockRepository();
    var oo 
=  mocks.DynamicMock < Func < string string >> ();
    Expect.Call(oo(
"" )).Return( " abc " );
    mocks.ReplayAll(); 

    var customer 
=   new  Customer(oo);
    customer.DoSomething(
"" );
}

 

於對這兩種委託請見:http://www.cnblogs.com/jams742003/archive/2009/10/31/1593393.html 

 

評論: 0 查看評論 發表評論

程序員找工做,就在博客園

最新新聞:
· 電子商務網站之信任度(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

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

相關文章
相關標籤/搜索