日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RhinoMock入门(3)——4种Mock类型

發布時間:2025/1/21 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RhinoMock入门(3)——4种Mock类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

作者: 梅樺 發表于 2010-05-10 11:15 原文鏈接 閱讀: 143 評論: 1

MockRespository有四種泛型方法:

·CreateMock

·CreateDynamicMock

·PartialMock

·Stub

3.5中,三種已經過時的方法分別由以下方法替代:

·StrictMock

·DynamicMock

·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

可以模擬類的一部分??梢元毩y試抽象方法。它只能用于類。加一官方描述的話:如果方法上沒有設置期望的值,就從一個調用類方法的默認類上去創建一個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

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

轉載于:https://my.oschina.net/jams742003/blog/8849

總結

以上是生活随笔為你收集整理的RhinoMock入门(3)——4种Mock类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。