zoukankan      html  css  js  c++  java
  • Moq测试基础说谈(四)——Mock类,创建对象,实用工厂

    Mock<T> Class

    定义为:

     

    public class Mock<T> : Mock

    where T : class

     

    这的构造方法:

    Mock<T>()

    Mock<T>(MockBehavior)

    Mock<T>(array<Object>[])

    Mock<T>(MockBehavior, array<Object>[])

     

    Mock的泛型实现类,它有很多方法和属性。这里一一列举。

    (一)方法

    (1)As<TInterface>方法

    mock添加接口实现(mock),可以给它指定设置。

    mock对象的属性(或方法)首次使用之前才有效。且,参数只能是接口。

    定义:

    public virtual Mock<TInterface> As<TInterface>()

    where TInterface : class

     

    示例:

    两个接口:

    其中的Icustomer接口还是前几篇中用到的,这里添加一个Iorder接口:

    public interface IOrder

    {

    string ShowTitle(string str);

    }

     

    Mock测试:

    var customer = new Mock<ICustomer>();

     

    customer.Setup(p => p.GetCall()).Returns("方法调用");

     

    customer.Object.GetCall();

    var order=customer.As<IOrder>();

    order.Setup(p => p.ShowTitle(It.IsAny<string>())).Returns("ok");

    Assert.AreEqual("ok",order.Object.ShowTitle(""));

     

    这个将出现异常,因为在As之前,已经对GetCall进行了调用。

     

    (2)SetUp方法

    为模拟的对象中的方法指定设置,它有两个重载:

    Setup(Expression<Action<T>>)

    Setup<TResult>(Expression<Func<T,TResult>>)

     

    从两个委托可以知道,这两个一个是为没有返回值的方法设置,一个是对有返回值的方法设置

    public void TestSetUp()

    {

    var customer = new Mock<ICustomer>();

     

        customer.Setup(p => p.AddCall())

    .Callback(()=>Console.WriteLine("没有返回值"));

     

        customer.Setup(p => p.GetCall(It.IsAny<string>()))

    .Returns("ok")

    .Callback((string q) => Console.WriteLine("有返回值"));

     

        customer.Object.AddCall();

        customer.Object.GetCall("");

    }

    这个前几篇已经广泛使用。

    (3) 其它方法略

     其它内容可见:

    http://www.cnblogs.com/jams742003/archive/2010/03/02/1676585.html

    现在看一下Mock的一个构造器:

    Mock<T>(MockBehavior),定义:

     

    public Mock(MockBehavior behavior)

     

    MockBehavior类是自定义mock行为的枚举:

    Strict mock对象没有合适的设置时,总是抛出异常

    Loose 从不抛出异常,如果必要会返回默认值(引用类型为null,值类型为0,或枚举和数组为空)

    Default mock行为默认值,就是Loose

     

    接口:

    public interface IOrder

    {

    string ShowTitle(string str);

    string ShowAddress();

     

    }

     

    测试:

    public void TestBehivor()

    {

        var order = new Mock<IOrder>();

        order.Object.ShowTitle(string.Empty);

    }

     

    这个接口有两个方法,在测试里,创建了mock对象,然后调用它的一个方法:ShowTitle

    但在之前,这个方法并没有被设置,这时mock对象的默认行为为Default,也就是Loose,所以不会出现异常。

    当把mock对象的行为设置为严格后:

    var order = new Mock<IOrder>(MockBehavior.Strict);

    order.Object.ShowTitle(string.Empty);

     

    测试就会出错:IOrder.ShowTitle("") invocation failed with mock behavior Strict.

     

    Mock的名字空间中还有一个MockFactory类,是一个用于构造多个mock对象的功能工厂

    它有三个方法:

    CreateVerifyVerifyAll

    Create的方法有:

    Create<T>()

    Create<T>(MockBehavior)

    Create<T>(array<Object>[])

    Create<T>(MockBehavior,array<Object>[])

     

    其中Create<T>(array<Object>[])定义:

    public Mock<T> Create<T>(

        params Object[] args

    ) where T : class

     

    它会根据参数来确定合适的被Mock的对象的构造器。

     

  • 相关阅读:
    iOS真机调试 for Xcode 5
    iOS/iphone开发如何为苹果开发者帐号APPID续费
    unity3d中布娃娃系统
    U3D实现与iOS交互
    两种方法连接MySql数据库
    Unity3D Gamecenter 得分上传失败的处理
    Unity3.5 GameCenter基础教程(转载)
    判断数字正则表达式
    (转)SQL server 2005查询数据库表的数量和表的数据量
    C#操作PowerDesigner代码
  • 原文地址:https://www.cnblogs.com/jams742003/p/1677020.html
Copyright © 2011-2022 走看看