天天看點

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

(一)次序(Ordered)

在rhinomock中,可以按次序調用方法。預設條件下,方法調用沒有順序。如果按次序錄制,那麼在調用方法時必須按錄制時相同的次序進行。

請看:

public interface ICustomer

{

   string ShowTitle(string str);

   int Unid { get; set; }

   string CustomerName { get; set; }

   string Address { get; set; }

}

測試:

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);

當使用次序時:

public void TestOrder()

    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();

這時,如果調用時沒有按期望時的次序進行,那就會出錯,抛出異常。

這種次序可以靈活使用,例如可以次序一個mock,然後期望條件達到後,再不按次序進行。注意:在進行回播前要退出次序。

(二)模拟委托

先定義委托:

public delegate void DoThing(string strMsg);

然後模拟委托:

[Test]

public void TestDelegate1()

    MockRepository mocks = new MockRepository();

    var oo = mocks.DynamicMock<DoThing>();

    oo("");

    mocks.VerifyAll();

有兩個系統定義的委托Func<TResult>和Action<T>

前是帶傳回值的委托,後者不帶傳回值,現在通過Action<T>來實作上例

public void TestDelegate2()

    var oo = mocks.DynamicMock<Action<string>>();

再來一個Func,即帶傳回值的委托的例子:

public void TestDelegateFunc()

    var oo = mocks.DynamicMock<Func<string, string>>();

    Expect.Call(oo("")).Return("abc");

    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));

    var customer = new Customer(oo);

    customer.DoSomething("");

于對這兩種委托請見:

http://www.cnblogs.com/jams742003/archive/2009/10/31/1593393.html

部落格園大道至簡

http://www.cnblogs.com/jams742003/

轉載請注明:部落格園

繼續閱讀