您的位置:首页 > 其它

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

2016-02-15 11:09 633 查看
(一)属性
(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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: