做者: 梅樺 發表於 2010-05-10 11:15 原文連接 閱讀: 143 評論: 1html
MockRespository有四種泛型方法:程序員
·CreateMock測試
·CreateDynamicMock網站
·PartialMockspa
·Stubcode
在3.5中,三種已通過時的方法分別由如下方法替代:orm
·StrictMock視頻
·DynamicMockhtm
·PartialMock對象
·Stub
它們各自對應靜態工廠方法:
·MockRepository.GenerateStrictMock
·MockRepository.GenerateMock
·MockRepository.GeneratePartialMock
·MockRepository.GenerateStub
(1)StrictMock
經過這個方法能夠建立一個具備嚴格語義的T類型mock對象,若是在使用過程當中沒有顯式的對過程進行錄製,則會出錯誤,並會拋出異常。
例如:
[Test]
public
void
TestStrictMock()
{
MockRepository mocks
=
new
MockRepository();
ICustomer customer
=
mocks.StrictMock
<
ICustomer
>
();
customer.Replay();
customer.ShowTitle(
""
);
mocks.VerifyAll();
}
這裏沒有對customer的ShowTitle方法顯式地安裝指望, 而mock對象又是具備嚴格語義的對象,因此這裏會發生錯誤,而拋出異常。
(2)DynamicMock
經過這個方法能夠建立一個具備動態語義的T類型mock對象,若是在使用過種中沒有顯式的對過程進行錄製,則不會出現異常。若是方法有返回值,那麼會返回null或0。
一樣以上個例子來講:
public
void
TestDynamicMock()
{
MockRepository mocks
=
new
MockRepository();
ICustomer customer
=
mocks.DynamicMock
<
ICustomer
>
();
customer.Replay();
customer.ShowTitle(
""
);
mocks.VerifyAll();
}
這裏一樣沒有進行顯式的安裝指望,但不會出現錯誤,不會拋出異常。因此當使用動態語義模擬對象時,沒有顯式安裝指望的方法會被忽略。
(3)PartialMock
能夠模擬類的一部分。能夠獨立測試抽象方法。它只能用於類。加一官方描述的話:若是方法上沒有設置指望的值,就從一個調用類方法的默認類上去建立一個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();
}
(4)Stub
直接以例子進行
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
網站導航:博客園首頁 我的主頁 新聞 閃存 小組 博問 社區 知識庫