• Moq测试基础说谈(三)——属性,常用方法


    (一)属性

    1测试

    准备:

    public class Customer

    {

    public virtual int Unid { get; set; }

    public virtual string Name { get; set; }

    }

    测试

    var customer = new Mock<Customer>();

    customer.Setup(p => p.Name).Returns("Tom");

     

    customer.SetupProperty(p => p.Name, "tt");

    以下就可以用这个属性了,和正常下属性访问相同。

    二)Callbacks

    当执行某方法时,调用其内部输入的(Action)委托

    看它的5种重载:

    Callback(Action)

    Callback<T>(Action<T>)

    Callback<T1, T2>(Action<T1, T2>)

    Callback<T1, T2, T3>(Action<T1, T2, T3>)

    Callback<T1, T2, T3, T4>(Action<T1, T2, T3, T4>)

    这个方法调用其内部输入的Action委托,Aciton<T>5种重载,所以这里的Callbacks5种重载。

    以第二个为例:

    它的定义为:

    ICallbackResult Callback<T>(Action<T> action)

    这个表示一个输入参数,

    var customer = new Mock<ICustomer>();

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

        .Returns("方法调用")

        .Callback((string s)=>Console.WriteLine("ok"+s));

    customer.Object.GetCall("x");

     

    这个Callback要调用的是GetCall(string s)中的s参数。

    三)Verify

    用于测试mock对象的方法或属性是否被调用执行。当不需要测试结果时用到

    重载很多:

    Verify()

    Verify(Expression<Action<T>>)

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

    Verify(Expression<Action<T>>, Times)

    Verify(Expression<Action<T>>, String)

    Verify<TResult>(Expression<Func<T, TResult>>, Times)

    Verify<TResult>(Expression<Func<T, TResult>>, String)

    Verify(Expression<Action<T>>, Times, String)

    Verify<TResult>(Expression<Func<T, TResult>>, Times, String)

     

    用其中三个举例

    第一个:Verify(),定义为:

    public void Verify()

    测试

    public void TestVerify()

    {

        var customer = new Mock<ICustomer>();

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

    .Returns("方法调用")

    .Callback((string s) => Console.WriteLine("ok" + s))

    .Verifiable();

     

        customer.Object.GetCall("调用了!");

        customer.Verify();

    }

    Mock对象中的GetCall方法设置为可证实的(Verifiable()),

    如果不调用粗体部分语句,那么customer.Verify()执行就不能通过。这个方法很有用。

     

    第二个:Verify(Expression<Action<T>>),定义为:

    public void Verify(Expression<Action<T>> expression)

     

    customer.Verify(p => p.GetCall("call"));

    如果没有调用且输入call字串的参数,则失败。

    第三个:Verify(Expression<Action<T>>, Times, String)

    定义:

    public void Verify(  Expression<Action<T>> expression,

        Times times,

        string failMessage

    )

     

    这个比上一个多了两个参数,一个用于表示调用次数相关描述,一个用于失败的时打印信息

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

                    .Returns("方法调用")

                    .Callback((string s) => Console.WriteLine("ok" + s))

                    .Verifiable();

    customer.Object.GetCall("call");

    customer.Object.GetCall("call");

    customer.Verify(p => p.GetCall("call"),

    Times.AtLeast(2),"至少应被调用2");

     

    GetCall方法被调用最少2次(且参数为call)时,测试成功。

    方法中Times是个Times类类型,它有多个方法:

    AtLeast

    AtLeastOnce

    AtMost

    AtMostOnce

    Between

    Exactly

    Never

    Once

    可以从语义上理解它们各自是什么意思,例如:AtLeast的定义为:

    public static Times AtLeast(

        int callCount

    )

    四)VerifyAll

    在使用Verify方法时,只有被标记为可证实的(.Verifiable())的才可以验证。

    VerifyAll会验证所有的调用:

     

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

             .Returns("方法调用")

             .Callback((string s) => Console.WriteLine("ok" + s));

     

    customer.Object.GetCall("call");

    customer.VerifyAll();

     

  • 相关阅读:
    实习笔记day03
    实习笔记day02
    实习笔记day01
    第4章:数组与方法
    栈内存与堆内存的区别
    java数据类型
    保护模式指令
    空描述符
    段描述符
    全局描述符表
  • 原文地址:https://www.cnblogs.com/jams742003/p/1676585.html
Copyright © 2020-2023  润新知