做者: 梅桦 发表于 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
网站导航:博客园首页 我的主页 新闻 闪存 小组 博问 社区 知识库