2019独角兽企业重金招聘Python工程师标准>>>

作者: 梅桦 发表于 2010-05-11 15:50 原文链接 阅读: 86 评论: 0

(一)Do(delegate)

有时候在测试过程中只返回一个静态的值是不够的,在这种情况下,Do()方法可以用来在方法调用时添加自定义的行为。一般来说,Do()方法会替换方法调用。它的返回值会从模拟的调用中返回(即使是有异常发生也是这样)。Do()的参数委托委托的方法的签名须和方法的签名匹配。只有当签名匹配时才能生效,且一个匹配生效一次。

看官方给出的例子:

public   class  Speaker
{
     private   readonly   string  firstName;
     private   readonly   string  surname;
     private  INameSource nameSource;

public  Speaker( string  firstName,  string  surname, INameSource nameSource)
    {
         this .firstName  =  firstName;
         this .surname  =  surname;
         this .nameSource  =  nameSource;
    }

public   string  Introduce()
    {
         string  name  =  nameSource.CreateName(firstName, surname);
         return   string .Format( " Hi, my name is {0} " , name);
    }
}

public   interface  INameSource
{
     string  CreateName( string  firstName,  string  surname);
}

现在演讲者和名字分开在两个类中。然后进行自我介绍,介绍时要介绍自己的姓名,即 FirstName+LastName 。在介绍中要用到 InameSource 中的 CreateName 方法,接下来将会模拟这个接口,而通过其它的方法来替代。

[Test]
public   void  SayHelloWorld()
{
    MockRepository mocks  =   new  MockRepository();
    INameSource nameSource  =  mocks.DynamicMock < INameSource > ();

Expect.Call(nameSource.CreateName( null ,  null ))
          .IgnoreArguments()
          .Do( new  NameSourceDelegate(Formal));

mocks.ReplayAll();
     string  expected  =   " Hi, my name is Ayende Rahien " ;
     string  actual  =   new  Speaker( " Ayende " ,  " Rahien " , nameSource).Introduce();
    Assert.AreEqual(expected, actual);
}

delegate   string  NameSourceDelegate( string  first,  string  surname);

private   string  Formal( string  first,  string  surname)
{
     return  first  +   "   "   +  surname;
}

看上段测试的粗体部分。

Do参数是委托类型,其中这个委托类型委托的方法的签名要和模拟对象中期望的要替换的方法的签名一致,即:

private   string  Formal( string  first,  string  surname)
string  CreateName( string  firstName,  string  surname);

两者相匹配。

然后当对演讲者构造时:
new Speaker("Ayende", "Rahien", nameSource)

会对演讲者三个域进行赋值

private   readonly   string  firstName;
private   readonly   string  surname;
private  INameSource nameSource;

接下来进行介绍时,调用方法:

public   string  Introduce()
{
     string  name  =  nameSource.CreateName(firstName, surname);
     return   string .Format( " Hi, my name is {0} " , name);
}

而这个方法则由Do方法的委托参数委托的方法来替代:

private   string  Formal( string  first,  string  surname)
{
     return  first  +   "   "   +  surname;
}

返回FirstName+空格+LastName

(二)With

流畅式的期望和验证语法。什么是流畅式?先看例子:

[Test]
public   void  TestFluent()
{
    MockRepository mocks  =   new  MockRepository();
    var customer  =  mocks.DynamicMock < ICustomer > ();

string  strTemp = string .Empty;

With.Mocks(mocks)
        .Expecting(
           delegate
          {
             Expect.Call(customer.ShowTitle( "" )).Return( " with 语句 " );
          })
        .Verify(
          delegate
          {
             strTemp  =  customer.ShowTitle( "" );
          });

Assert.AreEqual( " with 语句 " , strTemp);
}

这就是所谓的流畅式。通过匿名委托来实现。如果在匿名委托中完成则会隐匿调用ReplayAll()和mocks.VerifyAll()。

如果要启用次序,则可使用:ExpectingInSameOrder,例如:

[Test]
public   void  TestFluent()
{
    MockRepository mocks  =   new  MockRepository();
    var customer  =  mocks.DynamicMock < ICustomer > ();
     string  strTemp = string .Empty;
    With.Mocks(mocks).ExpectingInSameOrder(
         delegate
        {
           Expect.Call(customer.ShowTitle( "" )).Return( " with 语句 " );
           Expect.Call(customer.Unid).Return( 1 );
        })
       .Verify(
        delegate
       {
          strTemp  =  customer.ShowTitle( "" );
           int  i  =  customer.Unid;
       });

Assert.AreEqual( " with 语句 " , strTemp);
}

With语句的隐式使用

With可以隐式的创建Mock实例,并自动调用VerifyAll方法。

[Test]
public   void  TestWithMocker()
{
    With.Mocks(
         delegate
        {
          var customer  =  Mocker.Current.DynamicMock < ICustomer > ();
          Expect.Call(customer.ShowTitle( "" )).Return( " with 语句 " );
          Mocker.Current.ReplayAll();

Assert.AreEqual( " with 语句 " , customer.ShowTitle( "" ));
        });
}

这里才看出With确实很流畅。

下边说一下由显式创建Mock实例来代替隐式创建:

[Test]
public   void  TestWithMockerr()
{
    MockRepository mocks  =   new  MockRepository();
    With.Mocks(mocks,
        delegate
       {
          var customer  =  Mocker.Current.DynamicMock < ICustomer > ();
          Expect.Call(customer.ShowTitle( "" )).Return( " with 语句 " );

Mocker.Current.ReplayAll();

Assert.AreEqual( " with 语句 " , customer.ShowTitle( "" ));
       });
}

没多大区别。在使用Mocker.Current时,不能在嵌套中使用,因为这是个全局的,而With.Mocks会重写Mocker.Current

(三)Record-PlayBack

Rhinomock支持一种通过Using语句来进行录制回放的方式。

[Test]
public   void  TestRecordPlayback()
{
    MockRepository mocks  =   new  MockRepository();
    var customer  =  mocks.DynamicMock < ICustomer > ();

using  (mocks.Record())
    {
        Expect.Call(customer.ShowTitle( "" )).Return( " 录制回放 " );
    }

using  (mocks.Playback())
    {
        Assert.AreEqual( " 录制回放 " , customer.ShowTitle( "" ));
    }
}

评论: 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

网站导航:博客园首页  个人主页  新闻  闪存  小组  博问  社区  知识库

转载于:https://my.oschina.net/jams742003/blog/8853

RhinoMock入门(7)——Do,With和Record-playback相关推荐

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

    2019独角兽企业重金招聘Python工程师标准>>> 作者: 梅桦 发表于 2010-05-10 11:15 原文链接 阅读: 143 评论: 1 MockRespository有 ...

  2. RhinoMock入门(4)——次序和委托

    (一)次序(Ordered) 在rhinomock中,可以按次序调用方法.默认条件下,方法调用没有顺序.如果按次序录制,那么在调用方法时必须按录制时相同的次序进行. 请看: public interf ...

  3. RhinoMock入门(6)——安装结果和约束

    (一)安装结果(SetupResult) 有时候在模拟对象中需要一个方法的返回值,而不在意这个方法是否被调用.就可以通过安装结果(SetupRestult)来设置返回值,而绕开期望安装,且可以使用多次 ...

  4. 【Katalon学习一】Katalon Studio入门指南

    安装 下载 到Katalon下载页面获取最新版本的Katalon Studio.系统将自动检测到适合您的版本,并推荐下载.但是,您也可以在页面上选择您喜欢的版本.在深入研究自动化测试之前,请检查运行K ...

  5. AVFoundation 文本转语音和音频录制 播放

    现在你应该对AVFoundation有了比较深入的了解,并且对数字媒体的细节也有了一定认识,下面介绍一下 AVFoundation的文本转语音功能 AVSpeechSynthesizer 开发者可以使 ...

  6. linux qemu 使用方法

    目录 一.QEMU的运行模式 二.QEMU在使用者模式下执行程序 三.QEMU的系统模式使用 一.QEMU的运行模式 直接摘抄自己<揭秘家用路由器0day漏洞挖掘技术>,网上查了一下也没有 ...

  7. **PCD数据获取:Kinect+OpenNI+PCL对接(代码)

    前言: PCL使用点云作为数据格式,Kinect可以直接作为三维图像的数据源产生三维数据,其中的桥梁是OpenNI和PrimeSense.为了方便地使用Kinect的数据,还是把OpenNI获取的基础 ...

  8. 大气数据计算机英语,[听单词] 计算机专业英语词汇音频87,计算机英语单词MP3

    macroinstruction level n.宏指令级 probabilistic reasoning 概率推理 string process system,SPS 字串处理系统 transfer ...

  9. 深度相机(八)--OpenNI及与Kinect for windows SDK的比较

     OpenNI(开放自然交互)是一个多语言,跨平台的框架,它定义了编写应用程序,并利用其自然交互的API.OpenNI API由一组可用来编写通用自然交互应用的接口组成.OpenNI的主要目的是要 ...

最新文章

  1. uva 10152 ShellSort
  2. RPM包及其管理 rpm命令
  3. SAP CRM呼叫中心里多重Contact person confirm的处理
  4. 基于PageRank的作弊检测算法
  5. 【渝粤题库】国家开放大学2021春2038财务管理题目
  6. linux驱动 自旋锁
  7. 上传docker镜像到hub.docker
  8. PAT甲级1054 map的使用
  9. 第95天:CSS3 边框、背景和文字效果
  10. NPOI导出EXCEL报_服务器无法在发送 HTTP 标头之后追加标头
  11. adb 命令获取点击位置坐标
  12. 关于Java适配器模式,你该了解这些
  13. 王长君:城市交通智能管控20年发展反思
  14. 软件项目管理随谈(2)——项目合同问题
  15. 学妹:新手小白如何进行网络抓包?
  16. socket长连接的维持
  17. 模仿百思不得姐项目笔记
  18. 当cmd里安装不了Appium-Python-Client时,Requirement already satisfied: Appium-Python-Client in
  19. 我上传的CSDN资源无法使用的处理方法
  20. 无限复活服务器,绝地求生无限复活玩法说明 绝地求生无限复活分数计算规则/吃鸡攻略...

热门文章

  1. 启动一个java项目http状态 500 - 内部服务器错误_Java web服务器假死分析
  2. 解决Aireplay-ng信道问题
  3. Arduino可穿戴教程之第一个程序——上传运行程序(四)
  4. 自动渗透测试工具集APT2
  5. redis序列化_实例讲解Springboot以Template方式整合Redis及序列化问题
  6. 函数在机器底层是如何实现的_智能货柜专题三:如何实现不同机器“千机千面”?...
  7. sql左连接排序取第一个_详解kettle工具记录集连接功能及实验测试
  8. webserver获取http请求方的服务器ip_光大科技基础设施团队剖析HTTP协议
  9. h3c wa2620胖ap设置_AP考试|错过报名不用慌,香港考区目前仍然可以报名!
  10. iOS移除父控件中所有子控件的两种方式