美文网首页
(转)Moq测试基础说谈(三)——属性,常用方法

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

作者: func_老衲姓罗 | 来源:发表于2017-08-16 13:42 被阅读0次

    (一)属性
    (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种重载,所以这里的Callbacks有5种重载。
    以第二个为例:
    它的定义为:
    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();

    相关文章

      网友评论

          本文标题:(转)Moq测试基础说谈(三)——属性,常用方法

          本文链接:https://www.haomeiwen.com/subject/uqsirxtx.html