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

简介: MockRespository有四种泛型方法: ·CreateMock ·CreateDynamicMock ·PartialMock ·Stub 在3.5中,三种已经过时的方法分别由以下方法替代: ·StrictMock ·DynamicMock ·PartialMock ·Stub 它们各自对应静态工厂方法: ·MockRepository.

MockRespository有四种泛型方法:

·CreateMock<T>

·CreateDynamicMock<T>

·PartialMock

·Stub

3.5中,三种已经过时的方法分别由以下方法替代:

·StrictMock<T>

·DynamicMock<T>

·PartialMock<T>

·Stub<T>

它们各自对应静态工厂方法:

·MockRepository.GenerateStrictMock<T>

·MockRepository.GenerateMock

·MockRepository.GeneratePartialMock<T>

·MockRepository.GenerateStub<T>

 

 

1StrictMock

通过这个方法可以创建一个具有严格语义的T类型mock对象,如果在使用过程中没有显式的对过程进行录制,则会出错误,并会抛出异常。

例如:

[Test]
public   void  TestStrictMock()
{
    MockRepository mocks 
=   new  MockRepository();
    ICustomer customer 
=  mocks.StrictMock < ICustomer > ();

    customer.Replay();
    customer.ShowTitle(
"" );
    mocks.VerifyAll();
}

  

这里没有对customerShowTitle方法显式地安装期望, mock对象又是具有严格语义的对象,所以这里会发生错误,而抛出异常。

 

2DynamicMock

通过这个方法可以创建一个具有动态语义的T类型mock对象,如果在使用过种中没有显式的对过程进行录制,则不会出现异常。如果方法有返回值,那么会返回null0

同样以上个例子来说:

public   void  TestDynamicMock()
{
    MockRepository mocks 
=   new  MockRepository();
    ICustomer customer 
=  mocks.DynamicMock < ICustomer > ();

    customer.Replay();
    customer.ShowTitle(
"" );
    mocks.VerifyAll();    
}

  

这里同样没有进行显式的安装期望,但不会出现错误,不会抛出异常。所以当使用动态语义模拟对象时,没有显式安装期望的方法会被忽略。

 

3PartialMock

可以模拟类的一部分。可以独立测试抽象方法。它只能用于类。加一官方描述的话:如果方法上没有设置期望的值,就从一个调用类方法的默认类上去创建一个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();
}

  

4Stub

直接以例子进行

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是多么的方便。

 

博客园大道至简

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

转载请注明:博客园

目录
相关文章
|
JavaScript
Mock快速入门使用及组件构造首页2
Mock快速入门使用及组件构造首页2
93 2
|
前端开发
什么是 Mock 测试?掌握 Mock 测试的核心原理
Mock 的意思就是,当你很难拿到源数据时,你可以使用某些手段,去获取到跟源数据相似的假数据,拿着这些假数据,前端可以先行开发,而不需要等待后端给了数据后再开发。
|
XML 前端开发 测试技术
【前端小技巧】如何使用 Eolink Apilkit 调用 Mock ?
在开发过程中,进度比较赶的情况下,前端人员当页面写完时,后台的接口还没写完,等要交付的时候后端才把接口给你,这个时候就很尴尬。 这个时候 Mock 就可以很好的解决这个问题,前端团队可以在 API 还没开发完成的情况下,借助 Mock API 实现预对接,加速开发进程。测试团队可以通过 Mock API 解决不必要的系统,完成集成测试。 Eolink Apikit 为前端工程师提供 API 文档管理,快速接口测试,以及 Mock API 创建与调用,及查看文档变更历史的能力。有助于前端工程师快速查看 API 文档详情与历史记录,快速生成和使用 Mock API 提前进行页面效果验证。
82 0
|
2月前
|
JSON 前端开发 API
mock基本使用
【10月更文挑战第4天】
50 1
|
3月前
|
存储 XML 测试技术
etest高级变量支持Mock数据
eTest支持高级变量及Mock数据,对于自动化测试来说,这是一个提升效率并增强测试覆盖面的重要功能。合理使用eTest的高级变量支持Mock数据,能显著提高软件测试的质量和可靠性。测试人员应根据具体的测试需求,设计合适的Mock数据策略,并保持数据与实际应用场景的一致性和真实性。通过这种方式,可以确保在测试过程中获得有意义的测试结果,并提升测试过程的有效性和效率。
67 0
|
5月前
|
测试技术
详解单元测试问题之处理@Mock注解时mock对象的创建如何解决
详解单元测试问题之处理@Mock注解时mock对象的创建如何解决
50 1
|
5月前
|
JavaScript 开发者 索引
TypeScript接口与类型别名:深入解析与应用实践
【7月更文挑战第10天】TypeScript的接口和类型别名是定义类型的关键工具。接口描述对象结构,用于类、对象和函数参数的形状约束,支持可选、只读属性及继承。类型别名则为复杂类型提供新名称,便于重用和简化。接口适合面向对象场景,类型别名在类型重用和复杂类型简化时更有优势。选择时要考虑场景和灵活性。
|
5月前
|
JavaScript 前端开发 程序员
Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等
Typescript 【实用教程】(2024最新版)含类型声明,类型断言,函数,接口,泛型等
90 0
|
JavaScript 前端开发 开发者
TypeScript 入门指南:类型注解、接口和泛型
在现代前端开发中,TypeScript 已经成为越来越受欢迎的选择。TypeScript 是 JavaScript 的超集,它为 JavaScript 提供了类型系统和更多功能,帮助开发者在编码阶段发现潜在的错误,提高代码质量和可维护性。本文将深入探讨 TypeScript 中的核心特性:类型注解、接口和泛型。我们会从基础概念出发,循序渐进地讲解,同时提供丰富的代码示例和注释。
198 0
|
JSON 前端开发 JavaScript
Mock快速入门使用及组件构造首页1
Mock快速入门使用及组件构造首页1
91 1