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

简介: (一)属性 (1)测试 准备: public class Customer { public virtual int Unid { get; set; } public virtual string Name { get; set; } } 测试 var customer = new Mock(); customer.Setup(p => p.Name).Returns("Tom");   customer.SetupProperty(p => p.Name, "tt"); 以下就可以用这个属性了,和正常下属性访问相同。

(一)属性

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();

 

博客园大道至简

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

转载请注明:博客园

目录
相关文章
|
开发框架 安全 .NET
.NET使用Moq开源模拟库简化单元测试
.NET使用Moq开源模拟库简化单元测试~
395 0
|
运维 Java 测试技术
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
316 3
|
存储 测试技术 Python
记一次线上安全测试中误用父类属性导致数据污染的解决方案
在线上安全测试的过程中,会使用 Nmap 进行端口扫描,为了提升端口扫描的效率,扫描策略通常是检测常用端口是否处于开放状态,并在父类中使用名为 all_open_ports 的属性来记录这些开放的端口。 在后续的测试过程中,需要检查所涉及的端口是否包含在 all_open_ports 中。如果不存在,就需要进一步对这些端口进行开放检测。如果端口的检测结果是开放的,测试将继续进行并将这些端口记录到 all_open_ports 中,以便在下次遇到相同端口时无需重复检测。 然而,由于安全测试是多线程进行的,某些情况下可以将 all_open_ports 理解为共享变量,这导致当两个不同的测试环境同
|
JavaScript API 数据处理
【分享】宜搭开发,快速离线测试代码、组件api、组件属性
【分享】利用好浏览器的控制台功能(F12=&gt;控制台) by 页一
1636 2
【分享】宜搭开发,快速离线测试代码、组件api、组件属性
|
Java Maven 数据库
Maven的聚合 继承 属性 版本管理 多环境资源配置 跳过测试
Maven的聚合 继承 属性 版本管理 多环境资源配置 跳过测试
Maven的聚合 继承 属性 版本管理 多环境资源配置 跳过测试
|
存储 安全 Java
网站安全测试,会话 cookie 中缺少 HttpOnly 属性
可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务 “HttpOnly”属性的会话 cookie。由于此会话 cookie 不包含“HttpOnly”属性,因此 注入站点的恶意脚本可能访问此 cookie,并窃取它的值。任何存储在会话令牌中的 信息都可能被窃取,并在稍后用于身份盗窃或用户伪装。
1245 0
|
JavaScript 测试技术
软件测试面试题:如何去定位属性动态变化的元素?
软件测试面试题:如何去定位属性动态变化的元素?
641 0
|
关系型数据库 MySQL 测试技术
软件测试mysql面试题:列出ACID属性并解释?
软件测试mysql面试题:列出ACID属性并解释?
252 0
定义一个时钟类(TimeDemo),属性有:时、分、秒(默认值10时30分),方法有展示当前时间、过1秒,过1分钟,过1小时后的时分秒;在测试类中实现过10秒,过10分,过10小时后的时间展示
定义一个时钟类(TimeDemo),属性有:时、分、秒(默认值10时30分),方法有展示当前时间、过1秒,过1分钟,过1小时后的时分秒;在测试类中实现过10秒,过10分,过10小时后的时间展示
593 0
|
Shell Linux
linux shell之通过标识测试文件系统属性
linux shell之通过标识测试文件系统属性
296 0