(一)次序(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/轉載請注明:部落格園