RhinoMock入门(5)——属性,方法和方法选项

简介: (一)属性Property 属性也是一种方法。所以对于属性的期望,和方法是一样的。方法和属性的期望在前几篇随笔中已经大量使用。 通常的读或写属性器的期望 [Test]public void TestEvent(){    MockRepository mocks = new MockRepository();    IList _list = mocks.

(一)属性Property

属性也是一种方法。所以对于属性的期望,和方法是一样的。方法和属性的期望在前几篇随笔中已经大量使用。

通常的读或写属性器的期望

[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四种类型时说过:

一是传统的一个一个的安装,还有一种方式就是通过Stub方式实现。

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则很简单:

[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)是两个概念。

 

(二)方法

属性器有读和写属性,在安装期望时,只是对写属性设置即可。在方法中有多种情况:

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支持lambda3.x扩展属性,所以在安装时可以这样:

 

customer.Expect(p  =>  p.OutParas( "" out  strOut)).Return( " test " ).OutRef( " xxx " );

 

这个要结合Action<T>Func<Tresult>来分析,尤其是Action<T>

 

(三)方法选项

可以对安装期望的方法设置选项(options),例如:安装完期望的方法的可调用次数。

设置方法是:Expect.CallLastCall

这里分别说一下:

1Return

当然最长见的就是返回值,为读属性或带返回值的方法返回值设置,与期望匹配。 

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

 

2Throw

异常抛出。

[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()已经说过,不再赘述

 

博客园大道至简

http://www.cnblogs.com/jams742003/

转载请注明:博客园

目录
相关文章
|
5月前
|
数据采集 开发框架 .NET
from表单的作用、组成和用法
from表单的作用、组成和用法
|
6月前
|
JavaScript 前端开发 编译器
TypeScript【可选属性、只读属性、额外的属性检查、函数类型、类类型、继承接口】(四)-全面详解(学习总结---从入门到深化)
TypeScript【可选属性、只读属性、额外的属性检查、函数类型、类类型、继承接口】(四)-全面详解(学习总结---从入门到深化)
70 0
|
Java Scala 开发者
属性的注意事项|学习笔记
快速学习属性的注意事项。
属性的注意事项|学习笔记
|
移动开发 程序员
H5 中 bordercolorlight 属性的用法及作用
H5 中 bordercolorlight 属性的用法及作用
231 0
H5 中 bordercolorlight 属性的用法及作用
X11/XWindow更改属性代码
X11/XWindow更改属性代码
115 0
|
C++
VS 显示方法引用的设置方法
VS 中Codelens的设置面板没有相关的设置项?那如何调整出方法的引用呢?
2233 0
VS 显示方法引用的设置方法
|
Java
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(一)
【Groovy】循环控制 ( Java 语法循环 | 默认的 IntRange 构造函数 | 可设置翻转属性的 IntRange 构造函数 | 可设置是否包含 to 的构造函数 | 0..9 简写 )(一)
159 0
附加属性的不同使用方式
原文:附加属性的不同使用方式     [AttachedPropertyBrowsableForType(typeof(ButtonBase))] public static void SetIsClearTextButtonBehaviorEnabled(Button obj, bool value) { obj.
754 0
|
Windows 开发工具
UWP项目生成错误: 未能使用“CompileXaml”任务的输入参数初始化该任务。“CompileXaml”任务不支持“PlatformXmlDir”参数。请确认该参数存在于此任务中,并且是可设置的公共实例属性。
项目属性: 目标版本 16299  最低版本 14393   解决方法:目标版本 15063 最低版本 14393   The issue is a bug in the Windows SDK that is causing an incompatible MSBuild tasks as...
1486 0