(一)次序(Ordered

在rhinomock中,可以按次序调用方法。默认条件下,方法调用没有顺序。如果按次序录制,那么在调用方法时必须按录制时相同的次序进行。

请看:

public interface ICustomer
{
   string ShowTitle(string str);
   int Unid { get; set; }
   string CustomerName { get; set; }
   string Address { get; set; }
}

测试:

public void TestNoOrder()
{
    MockRepository mocks = new MockRepository(); 
    ICustomer customer = mocks.StrictMock<ICustomer>();

//默认条件下是没顺序的
    Expect.Call(customer.Unid).Return(1);
    Expect.Call(customer.CustomerName).Return("宋江");
    Expect.Call(customer.Address).Return("山东");

mocks.ReplayAll();

Assert.AreEqual("宋江", customer.CustomerName);
    Assert.AreEqual(1, customer.Unid);
    Assert.AreEqual("山东", customer.Address);
}

当使用次序时:

public void TestOrder()
{
    MockRepository mocks = new MockRepository(); 
    ICustomer customer = mocks.StrictMock<ICustomer>();
    using (mocks.Ordered())
    {
        Expect.Call(customer.Unid).Return(1);
        Expect.Call(customer.CustomerName).Return("宋江");
        Expect.Call(customer.Address).Return("山东");
    }

mocks.ReplayAll();

Assert.AreEqual("宋江", customer.CustomerName);
    Assert.AreEqual(1, customer.Unid);
    Assert.AreEqual("山东", customer.Address);
}

这时,如果调用时没有按期望时的次序进行,那就会出错,抛出异常。

这种次序可以灵活使用,例如可以次序一个mock,然后期望条件达到后,再不按次序进行。注意:在进行回播前要退出次序。

(二)模拟委托

先定义委托:

public delegate void DoThing(string strMsg);

然后模拟委托:

[Test]
public void TestDelegate1()
{
    MockRepository mocks = new MockRepository();
    var oo = mocks.DynamicMock<DoThing>();
    oo("");
    mocks.ReplayAll();
    oo("");
    mocks.VerifyAll();
}

有两个系统定义的委托Func<TResult>和Action<T>

前是带返回值的委托,后者不带返回值,现在通过Action<T>来实现上例

[Test]
public void TestDelegate2()
{
    MockRepository mocks = new MockRepository();
    var oo = mocks.DynamicMock<Action<string>>();

oo("");
    mocks.ReplayAll();
    oo("");
    mocks.VerifyAll();
}

再来一个Func,即带返回值的委托的例子:

[Test]
public void TestDelegateFunc()
{
    MockRepository mocks = new MockRepository();
    var oo = mocks.DynamicMock<Func<string, string>>();

Expect.Call(oo("")).Return("abc");
    mocks.ReplayAll();
    Assert.AreEqual("abc", oo(""));
}

再来一个例子:

public class Customer
{
     Func<string, string> _fun;
     public Customer(Func<string, string> fun)
     {
          _fun = fun;
     }

public void DoSomething(string strMsg)
     {
          Console.WriteLine(_fun(strMsg));
     }
}

测试:

[Test]
public void TestDelegateFunc()
{
    MockRepository mocks = new MockRepository();
    var oo = mocks.DynamicMock<Func<string, string>>();
    Expect.Call(oo("")).Return("abc");
    mocks.ReplayAll();

var customer = new Customer(oo);
    customer.DoSomething("");
}

于对这两种委托请见:http://www.cnblogs.com/jams742003/archive/2009/10/31/1593393.html

转载于:https://www.cnblogs.com/jams742003/archive/2010/05/10/1731767.html

RhinoMock入门(4)——次序和委托相关推荐

  1. RhinoMock入门(7)——Do,With和Record-playback

    2019独角兽企业重金招聘Python工程师标准>>> 作者: 梅桦 发表于 2010-05-11 15:50 原文链接 阅读: 86 评论: 0 (一)Do(delegate) 有 ...

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

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

  3. C#入门面向对象编程(委托的使用)

    委托的概念 一.了解委托(delegate) 1.委托是一种全新的面向对象语言特性,运行在.NET平台 2.基于委托,开发事件驱动程序变得非常简单 3.使用委托可以大大简化多线程的难度 二.理解委托 ...

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

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

  5. 文献阅读与写作(一)

    转载自:http://www.dxy.cn/bbs/topic/8784499?from=recommendhttp://blog.sciencenet.cn/blog-1089082-904345. ...

  6. [ASP.NET入门随想七]主角与配角——OO思想的多态、接口与委托

    [ASP.NET入门随想七]主角与配角 --OO思想的多态.接口与委托 曾几何时,我们的父辈接受到的对美好生活的描绘是:"楼上楼下.电灯电话",三十年过去了,电灯电话早已已成为我们 ...

  7. 委托(C#入门详解学习笔记)

    委托(C#入门详解学习笔记) 几个概念 什么是委托 委托的声明(自定义委托) 委托的常规使用 通用泛型委托类型的简单使用(Func和Action) 委托的高级使用 多播委托 委托的异步调用 使用接口取 ...

  8. C#语言入门详解笔记(9)—P19 委托详解

    C#语言入门详解_哔哩哔哩_bilibiliC#语言入门详解搬运,随youtube上进度更新.刘老师的C#视频教程到30集就告一段落了,感谢刘老师在这5年间的付出.能上youtube的同学可以去刘老师 ...

  9. 【详细】【转】C#中理解委托和事件 事件的本质其实就是委托 RabbitMQ英汉互翼(一),RabbitMQ, RabbitMQ教程, RabbitMQ入门...

    [详细][转]C#中理解委托和事件 文章是很基础,但很实用,看了这篇文章,让我一下回到了2016年刚刚学委托的时候,故转之! 1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C ...

最新文章

  1. 基于串级PID的直立车控制算法研究
  2. 面临找工作,要记住给自己的这些话。
  3. luoguP2657 [SCOI2009]windy数
  4. 强化学习笔记4:强化学习分类
  5. 55种数据可视化开源工具_4种开源工具让我的创业起步
  6. 把结构用二进制方式写入文件,并读出来[转]
  7. python如何执行代码漏洞_任意代码执行漏洞
  8. 人工智能TensorFlow工作笔记004---还记得标准差嘛_标准差的由来
  9. Spring-beans-BeanFactoryPostProcessor
  10. 《NLTK基础教程——用NLTK和Python库构建机器学习应用》——2.8 罕见词移除
  11. 单线程多线程_理解线程,就会由单线程向多线程进军
  12. 《Perl语言入门》
  13. android imagebutton 设置边框,【Android技巧】ImageButton 去边框 添加按下效果
  14. Vue表情包输入组件
  15. Word插入脚注后分节符自动变成分页符解决办法
  16. 如何安装和使用easypanel
  17. 第四周day19-三剑客之awk
  18. Linux 2.6内核的设备模型
  19. 月薪3000与月薪30000的文案区别
  20. scrapy的spider中为什么使用yield

热门文章

  1. PHP笔记-AES加解密(PHP7)
  2. Qt文档阅读笔记-QLatin1String解析及文本段跨行赋值
  3. SpringShell文档阅读笔记-SpringShell的基本使用
  4. Qt工作笔记-对QObject::connect函数进一步认识(重载)
  5. C++工作笔记-map有自动排序的功能
  6. php集成环境还需要mysql吗_是选择php集成环境好还是分开安装的原生版好
  7. ac自动机 匹配最长前缀_别再暴力匹配字符串了,高效的KMP,才是真的香
  8. 打开mysql的远程连接_开启mysql的远程访问权限
  9. 突破5G壁垒,睿至科技集团以技术实力赋能产业发展
  10. python网盘系统_python做系统