RhinoMock入门(4)——次序和委托
生活随笔
收集整理的這篇文章主要介紹了
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(){
????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);
}
?
這時,如果調用時沒有按期望時的次序進行,那就會出錯,拋出異常。
這種次序可以靈活使用,例如可以次序一個mock,然后期望條件達到后,再不按次序進行。注意:在進行回播前要退出次序。
?
(二)模擬委托
先定義委托:
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();
}
?
有兩個系統定義的委托Func<TResult>和Action<T>
前是帶返回值的委托,后者不帶返回值,現在通過Action<T>來實現上例
[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
?
?
轉載于:https://www.cnblogs.com/jams742003/archive/2010/05/10/1731767.html
總結
以上是生活随笔為你收集整理的RhinoMock入门(4)——次序和委托的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安全使用网上银行 享受在线购物时尚生活
- 下一篇: 《Effective C#中文版:改善C