做者: 梅桦 发表于 2010-05-10 17:21 原文连接 阅读: 97 评论: 0html
(一)属性Property程序员
属性也是一种方法。因此对于属性的指望,和方法是同样的。方法和属性的指望在前几篇随笔中已经大量使用。网站
一般的读或写属性器的指望spa
[Test]
public
void
TestEvent()
{
MockRepository mocks
=
new
MockRepository();
IList
<
int
>
_list
=
mocks.DynamicMock
<
IList
<
int
>>
();
Expect.Call(_list.Count).Return(
5
);
mocks.ReplayAll();
Assert.AreEqual(
5
, _list.Count);
}
这个是很简单的。而后还有一种自动属性指望的,设置属性行为来达到自动属性指望安装。这个有两种方式,在前边说Mock四种类型时说过:code
一是传统的一个一个的安装,还有一种方式就是经过Stub方式实现。orm
public
interface
ICustomer
{
int
Unid {
get
;
set
; }
string
CustomerName {
get
;
set
; }
string
Address {
get
;
set
; }
string
ShowTitle(
string
str);
}
这个接口有3个属性。视频
[Test]
public
void
TestProperty()
{
MockRepository mocks
=
new
MockRepository();
var customer
=
mocks.DynamicMock
<
ICustomer
>
();
using
(mocks.Record())
{
Expect.Call(customer.Unid).PropertyBehavior();
Expect.Call(customer.CustomerName).PropertyBehavior();
Expect.Call(customer.Address).PropertyBehavior();
}
customer.Unid
=
5
;
Assert.AreEqual(
5
, customer.Unid);
}
经过这种方法要分别为mock对象设置属性行为。而经过Stub则很简单:htm
[Test]
public
void
TestPropertyStub()
{
MockRepository mocks
=
new
MockRepository();
var customer
=
mocks.Stub
<
ICustomer
>
();
customer.Unid
=
5
;
Assert.AreEqual(
5
, customer.Unid);
}
经过PropertyBehavior()方法能够为属性模拟行为。这上行为会在模拟对象的生命周期内有效。模拟对象(mock object)与模拟(mock)是两个概念。 对象
(二)方法blog
属性器有读和写属性,在安装指望时,只是对写属性设置便可。在方法中有多种状况:
(1)无返回值
void
NoValues(
string
str);
安装指望:
Expect.Call(
delegate
{ customer.NoValues(
""
); });
(2)带返回值
这个前边已经大量使用
string
ShowTitle(
string
str);
安装指望:
Expect.Call(customer.ShowTitle(
""
)).Return(
"
为空
"
);
(3)带输出参数或引用参数的方法
[Test]
public
void
TestOutPara()
{
MockRepository mocks
=
new
MockRepository();
var customer
=
mocks.DynamicMock
<
ICustomer
>
();
string
strOut
=
"
123
"
;
Expect.Call(customer
.OutParas(
""
,
out
strOut))
.Return(
"
test
"
).OutRef(
"
xxx
"
);
mocks.ReplayAll();
customer.OutParas(
""
,
out
strOut);
Assert.AreEqual(
"
xxx
"
, strOut);
}
看粗体部分。带输出或引用参数的方法安装指望和正常调用的方式类似。
这里说明一下,RhinoMock3.5支持lambda和3.x扩展属性,因此在安装时能够这样:
customer.Expect(p
=>
p.OutParas(
""
,
out
strOut)).Return(
"
test
"
).OutRef(
"
xxx
"
);
这个要结合Action和Func来分析,尤为是Action。
(三)方法选项
能够对安装指望的方法设置选项(options),例如:安装完指望的方法的可调用次数。
设置方法是:Expect.Call或LastCall
这里分别说一下:
(1)Return
固然最长见的就是返回值,为读属性或带返回值的方法返回值设置,与指望匹配。
[Test]
public
void
TestMethodOptions()
{
MockRepository mocks
=
new
MockRepository();
var customer
=
mocks.DynamicMock
<
ICustomer
>
();
using
(mocks.Record())
{
Expect.Call(customer.Unid)
.Return(
10
);
}
Assert.AreEqual(
10
, customer.Unid);
}
(2)Throw
异常抛出。
[Test]
public
void
TestMethodOptions()
{
MockRepository mocks
=
new
MockRepository();
var customer
=
mocks.DynamicMock
<
ICustomer
>
();
using
(mocks.Record())
{
Expect.Call(customer.ShowTitle(
""
))
.Throw(
new
Exception(
"
不能为空
"
));
}
customer.ShowTitle(
""
);
}
结果:failed: System.Exception : 不能为空
(3)方法容许使用的次数
[Test]
public
void
TestMethodOptions()
{
MockRepository mocks
=
new
MockRepository();
var customer
=
mocks.DynamicMock
<
ICustomer
>
();
using
(mocks.Record())
{
Expect.Call(customer.ShowTitle(
""
))
.Return(
"
不能为空
"
)
.Repeat.Once();
}
Assert.AreEqual(
"
不能为空
"
,customer.ShowTitle(
""
));
Assert.AreEqual(
"
不能为空
"
, customer.ShowTitle(
""
));
}
安装指望时,容许调用1次。因此对于两次断言使用,会有异常出现。除了Once,还有Twice(),Any等
(4)忽略方法参数
[Test]
public
void
TestMethodOptions()
{
MockRepository mocks
=
new
MockRepository();
var customer
=
mocks.DynamicMock
<
ICustomer
>
();
using
(mocks.Record())
{
Expect.Call(customer.ShowTitle(
null
))
.Return(
"
不能为空
"
)
.IgnoreArguments();
}
Assert.AreEqual(
"
不能为空
"
, customer.ShowTitle(
""
));
}
请看粗体部分,忽略了字串参数。
(5)简单的自动属性
PropertyBehavior()已经说过,再也不赘述
评论: 0 查看评论 发表评论
程序员找工做,就在博客园
最新新闻:
· 电子商务网站之信任度(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
网站导航:博客园首页 我的主页 新闻 闪存 小组 博问 社区 知识库