JustMock .NET单元测试利器(二)JustMock基础
Mock是Telerik®JustMock框架中的主要类。Mock用于创建实例和静态模拟,安排和验证行为。
本文将介绍 “Mock”的基本用法:
首先我们创建一个IFoo对象
publicinterfaceIFoo
{
intBar{get;set;}
voidToString();
}
创建实例模拟
要创建实Mock实例,您需要使用该Mock.Create方法或其通用版本Mock.Create<T>。有了这个,你创建一个虚假的对象,取代你的测试中的真实对象。
var foo
=Mock.Create<IFoo>();
此外,您可以指定初始化传递给构造函数参数。
publicclassFoo
{
publicFoo(int arg)
{
}
}
对应的单元测试如下:
[TestMethod]
publicvoidSimpleTestMethod()
{
//Arrange
var foo =Mock.Create(()=>newFoo(1));
//Assert
Assert.IsNotNull(foo);
}
Arrange
该Arrange方法用于更改模拟方法或属性调用的行为。它与本节中描述的一个或多个支持的行为一起使用:
· CallOriginal() -
使用原来的方法执行。
· DoInstead() -
调用方法时执行自定义代码。
· Initialize() -
设置所有的框架方法。
· DoNothing() -
忽略呼叫。此方法仅用于可读性,仅适用于void方法。
· MustBeCalled() -
标记该方法在执行测试期间声明它被调用。
· Raise() -
提出嘲笑的事件。
· Raises() -
一旦方法被调用,就提出一个事件。
· Returns() -
使用非void方法返回一个自定义值。
· Throws() -
调用方法后抛出异常。
以下是如何安排方法调用返回自定义指定值的示例。
[TestMethod]
publicvoidArrangingAMethodCallToReturnACustomValue()
{
//Arrange
var foo =Mock.Create<IFoo>();
Mock.Arrange(()=> foo.Bar).Returns(10);
}
如果你想模拟一个属性集,而不是使用“Arrabge”方法你应该使用“ArrangeSet”方法。下面的例子演示了如何当属性设置为特定值时抛出异常。
[TestMethod]
publicvoidArrangingAPropertySetToThrowAnException()
{
//Arrange
var foo =Mock.Create<IFoo>();
Mock.ArrangeSet(()=> foo.Bar=0).Throws<ArgumentException>();
}
Arrange -
使用具有动态值的表达式
该Arrange方法还允许您在参数表达式中使用动态值。这使您可以对使用lambda表达式的排列进行细化控制。让我们来看看下面的场景:
publicclassBookService
{
privateIBookRepository repository;
publicBookService(IBookRepository repository)
{
this.repository = repository;
}
publicBookGetSingleBook(int id)
{
return repository.GetWhere(book => book.Id== id);
}
}
publicinterfaceIBookRepository
{
BookGetWhere(Expression<Func<Book,bool>> expression);
}
publicclassBook
{
publicintId{get;privateset;}
publicstringTitle{get;set;}
}
在这里,我们有一个BookService我们用来从知识库中获取特定的书籍。在IBookRepository只有一个方法- GetWhere其用于返回一个Book由附带作为参数λ表达式指定。看看使用lambda表达式来获取具有特定属性的书GetSingleBook的BookService类的方法id。
在下面的测试中,我们在Arrange阶段中使用lambda表达式:
[TestMethod]
publicvoidShouldAssertMockForDynamicQueryWhenComparedUsingAVariable()
{
//Arrange
var repository =Mock.Create<IBookRepository>();
var expected =newBook{Title="Adventures"};
var service =newBookService(repository);
Mock.Arrange(()=> repository.GetWhere(book => book.Id==1))
.Returns(expected)
.MustBeCalled();
//Act
var actual = service.GetSingleBook(1);
//Assert
Assert.AreEqual(actual.Title, expected.Title);
}
我们指定,当存储库GetWhere方法被调用id=1时,返回的书应该是特定的书。然后我们采取行动
- 我们执行的GetSingleBook方法,BookService我们断言预期的书被返回。
从构造函数参数中自动排列虚拟属性集
正如你在上面第一节看到的那样,当你使用时Mock.Create,你可以指定初始化参数传递给创建的对象的构造函数。当构造函数设置包含在你正在模拟的类型中的虚拟属性的值时,可以用Mock.Create同样的方法。结果将是虚拟属性的值将被自动排列。我们来看一个演示这个特性的例子:
publicclassItem
{
publicvirtualstringName{get;set;}
publicItem(string name)
{
Name= name;
}
}
[TestMethod]
publicvoidShouldAutoArrangePropertySetInConstructor()
{
//Arrange
var expected ="name";
var item =Mock.Create<Item>(()=>newItem(expected));
//Assert
Assert.AreEqual(expected, item.Name);
}
Assert-
验证行为
在您安排某些方法/属性调用的行为并执行操作之后,您需要验证返回的结果或一般行为。你用这个Mock.Assert方法做这个。
让我们Assert一个排列方法实际上是被调用的。
[TestMethod]
publicvoidTestMethodShowingAssertFunctionality()
{
//Arrange
var foo =Mock.Create<IFoo>();
Mock.Arrange(()=> foo.ToString()).MustBeCalled();
//Act
foo.ToString();
//Assert
Mock.Assert(foo);
}
即使你不安排方法调用,你仍然可以断言该方法是否被调用。您也可以像调用方法一样断言属性获取调用。
[TestMethod]
publicvoidTestMethodShowingAssertFunctionalityOnPropGet()
{
//Arrange
var foo =Mock.Create<IFoo>();
Mock.Arrange(()=> foo.Bar).Returns(10);
//Act
var returnValue =foo.Bar;
//Assert
Assert.AreEqual(10,returnValue);
}
断言属性, “您需要使用”Mock.AssertSet“。为了演示使用的模拟.AssertSet'我们将使用前面提到的行为在这个主题之一,即”MustBeCalled“。我们将验证属性实际上是设置在测试运行。
[TestMethod]
publicvoidTestMethodShowingAssertFunctionalityOnPropSet()
{
//Arrange
var foo =Mock.Create<IFoo>();
Mock.ArrangeSet(()=> foo.Bar=0).MustBeCalled();
//Act
foo.Bar=0;
//Assert
Mock.Assert(foo);
}
让我们用一个稍微复杂的例子来完成这个话题。您可能会遇到返回值列表的情况。下一个示例演示如何验证返回的项目的数量并声明调用了特定的方法。
对于这个例子,我们将使用以下内容IFooRepository:
publicinterfaceIFooRepository
{
List<Foo>GetFoos{get;set;}
}
[TestMethod]
publicvoidVerifyingNumbersOfReturnedItemsAndAssertingAMethodIsCalled()
{
//Arrange
var repository =Mock.Create<IFooRepository>();
List<Foo> list =newList<Foo>(){
newFoo(1),
newFoo(2),
newFoo(3),
newFoo(4),
newFoo(5)
};
Mock.Arrange(()=> repository.GetFoos).Returns(list).MustBeCalled();
//Act
IList<Foo> foos = repository.GetFoos;
var expected =5;
var actual = foos.Count;
//Assert
Assert.AreEqual(expected, actual);
Mock.Assert(repository);
}
参考文献:
JustMock .NET单元测试利器(二)JustMock基础的更多相关文章
- JustMock .NET单元测试利器(一)
1.什么是Mock? Mock一词是指模仿或者效仿,用于创建实例和静态模拟.安排和验证行为.在软件开发中提及"mock",通常理解为模拟对象.模拟对象的概念就是我们想要创建一个可以 ...
- JustMock .NET单元测试利器(三)用JustMock测试你的应用程序
用JustMock测试你的应用程序 本主题将指导您通过几个简单的步骤来使用Telerik®JustMock轻松测试您的应用程序.您将理解一个简单的原理,称为Arrange / Act / Assert ...
- Python的单元测试(二)
title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...
- PropertyGrid控件由浅入深(二):基础用法
目录 PropertyGrid控件由浅入深(一):文章大纲 PropertyGrid控件由浅入深(二):基础用法 控件的外观构成 控件的外观构成如下图所示: PropertyGrid控件包含以下几个要 ...
- LINUX二十个基础命令
LINUX二十个基础命令 一. useradd命令 1.命令格式: useradd 选项 用户名 2.命令功能: 添加新的用户账号 3.常用参数: -c comment 指定一段注释性描述.-d 目录 ...
- [转]前端利器:SASS基础与Compass入门
[转]前端利器:SASS基础与Compass入门 SASS是Syntactically Awesome Stylesheete Sass的缩写,它是css的一个开发工具,提供了很多便利和简单的语法,让 ...
- Swift语言指南(二)--语言基础之注释和分号
原文:Swift语言指南(二)--语言基础之注释和分号 注释 通过注释向自己的代码中注入不可执行的文本,作为你自己的笔记或提示.Swift编译器运行时会忽略注释. Swift的注释与C语言极其相似,单 ...
- PHP单元测试利器:PHPUNIT初探
开始动手安装phpunit 本文中将通过介绍php中的单元测试利器phpunit(http://phpunit.de/),并通过实际例子来讲解如何在实际工作中运用phpunit.首先安装phpunit ...
- 二十二. Python基础(22)--继承
二十二. Python基础(22)--继承 ● 知识框架 ● 继承关系中self的指向 当一个对象调用一个方法时,这个方法的self形参会指向这个对象 class A: def get(s ...
随机推荐
- bzoj 4872: [Shoi2017]分手是祝愿 [期望DP]
4872: [Shoi2017]分手是祝愿 题意:n个灯开关游戏,按i后i的约数都改变状态.随机选择一个灯,如果当前最优策略\(\le k\)直接用最优策略.问期望步数\(\cdot n! \mod ...
- CF528D. Fuzzy Search [FFT]
CF528D. Fuzzy Search 题意:DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t 预处理\(f[i][ ...
- 基本的socket编程的介绍
网络IPC:套接字 用socket实现两个不同的主机之间的通信(涉及到一些基本的计算机网络知识 略过..) 服务器端: 1.socket函数:生成一个套接字 int socket(int domai ...
- xftp上传失败之解决办法
修改/usr/local 文件夹权限 rwx 为不可读不可写第三方不可访问 报错 传输状态 恢复文件夹/usr/local 读写第三方访问权限 成功上传
- 学习H5仿制网站时遇到的问题
学习H5的第二周,开始仿制网站,在本过程中也发现了自己存在的更多问题. 1.TOP块:在制作top中,遇到的第一个问题,一旦top左右的背景色不同该怎样去调整 解决方式:建立两个div取代一个div ...
- IntelliJ IDEA下Maven SpringMVC+Mybatis入门搭建例子
很久之前写了一篇SSH搭建例子,由于工作原因已经转到SpringMVC+Mybatis,就以之前SSH实现简单登陆的例子,总结看看SpringMVC+Mybatis怎么实现. Spring一开始是轻量 ...
- "abc123 ,def456",反转字母,其他位置不变
"abc123 ,def456",反转字母,其他位置不变. 无意间看到个有意思的面试题,忽然来了兴趣想着来做一下. 操作字符串用正则的效率比较高,但第一反应还是用原生来操作.下面说 ...
- Java常用日志框架介绍
Java常用日志框架介绍 java日志概述 对于一个应用程序来说日志记录是必不可少的一部分.线上问题追踪,基于日志的业务逻辑统计分析等都离不日志.java领域存在多种日志框架,目前常用的日志框架包括L ...
- Go生成easyjson文件
[生成easyjson文件] cd services/api_adapter/aliafp #先删除已有的aliafp_easyjson.go文件,并且把除了aliafp.go以外的其他文件移动到 ...
- Go学习笔记02-源码
第二部分 源码 基于 Go 1.4,相关文件位于 src/runtime 目录.文章忽略了 32bit 代码,有兴趣的可自行查看源码文件.为便于阅读,示例代码做过裁剪. 1. Memory Alloc ...