日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時(shí)間:2025/1/21 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RhinoMock入门(3)——4种Mock类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

作者: 梅樺 發(fā)表于 2010-05-10 11:15 原文鏈接 閱讀: 143 評(píng)論: 1

MockRespository有四種泛型方法:

·CreateMock

·CreateDynamicMock

·PartialMock

·Stub

3.5中,三種已經(jīng)過時(shí)的方法分別由以下方法替代:

·StrictMock

·DynamicMock

·PartialMock

·Stub

它們各自對(duì)應(yīng)靜態(tài)工廠方法:

·MockRepository.GenerateStrictMock

·MockRepository.GenerateMock

·MockRepository.GeneratePartialMock

·MockRepository.GenerateStub?

?

1StrictMock

通過這個(gè)方法可以創(chuàng)建一個(gè)具有嚴(yán)格語義的T類型mock對(duì)象,如果在使用過程中沒有顯式的對(duì)過程進(jìn)行錄制,則會(huì)出錯(cuò)誤,并會(huì)拋出異常。

例如:

[Test]
public ? void ?TestStrictMock()
{
????MockRepository?mocks?
= ? new ?MockRepository();
????ICustomer?customer?
= ?mocks.StrictMock < ICustomer > ();

????customer.Replay();
????customer.ShowTitle(
"" );
????mocks.VerifyAll();
}

??

這里沒有對(duì)customerShowTitle方法顯式地安裝期望, mock對(duì)象又是具有嚴(yán)格語義的對(duì)象,所以這里會(huì)發(fā)生錯(cuò)誤,而拋出異常。?

2DynamicMock

通過這個(gè)方法可以創(chuàng)建一個(gè)具有動(dòng)態(tài)語義的T類型mock對(duì)象,如果在使用過種中沒有顯式的對(duì)過程進(jìn)行錄制,則不會(huì)出現(xiàn)異常。如果方法有返回值,那么會(huì)返回null0

同樣以上個(gè)例子來說:

public ? void ?TestDynamicMock()
{
????MockRepository?mocks?
= ? new ?MockRepository();
????ICustomer?customer?
= ?mocks.DynamicMock < ICustomer > ();

????customer.Replay();
????customer.ShowTitle(
"" );
????mocks.VerifyAll();????
}

??

這里同樣沒有進(jìn)行顯式的安裝期望,但不會(huì)出現(xiàn)錯(cuò)誤,不會(huì)拋出異常。所以當(dāng)使用動(dòng)態(tài)語義模擬對(duì)象時(shí),沒有顯式安裝期望的方法會(huì)被忽略。?

3PartialMock

可以模擬類的一部分。可以獨(dú)立測(cè)試抽象方法。它只能用于類。加一官方描述的話:如果方法上沒有設(shè)置期望的值,就從一個(gè)調(diào)用類方法的默認(rèn)類上去創(chuàng)建一個(gè)Mock對(duì)象。

現(xiàn)在用例子來說明一下,這個(gè)例子通過抽象類來進(jìn)行,抽象類中有一模板方法,而其中的方法是個(gè)抽象的,這里通過官網(wǎng)提供的例子來進(jìn)行:

?

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

直接以例子進(jìn)行

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;
???}
}

??

測(cè)試:

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

??

設(shè)置接口屬性行為,可以在實(shí)例中使用。這個(gè)屬性行為可以通過Stub來設(shè)置,那就簡(jiǎn)單了:

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

??

當(dāng)然,也可利用反射來封裝對(duì)象屬性行為設(shè)置mock對(duì)象的所有屬性:

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是多么的方便。?

評(píng)論: 1 查看評(píng)論 發(fā)表評(píng)論

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

最新新聞:
· 電子商務(wù)網(wǎng)站之信任度(2010-10-09 17:02)
· 馬云:管理的核心在于“抓住人性的本真”(2010-10-09 16:52)
· 另一 Windows Phone Live 主頁截圖現(xiàn)身 Windows Phone 7 視頻(2010-10-09 16:38)
· 谷歌首名員工:公司成功歸結(jié)于運(yùn)氣不錯(cuò)(2010-10-09 16:32)
· 神奇小子Geohot帶著“l(fā)imera1n”回歸(2010-10-09 16:29)

編輯推薦:遠(yuǎn)離.NET

網(wǎng)站導(dǎo)航:博客園首頁??個(gè)人主頁??新聞??閃存??小組??博問??社區(qū)??知識(shí)庫

轉(zhuǎn)載于:https://my.oschina.net/jams742003/blog/8849

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。