ASP.NET MVC5 学习笔记-5 测试
1. 测试步骤
- 准备
- 执行
- 检查
2. 创建单元测试
注意:单元测试不要包含数据库操作,包含数据库操作的一般成为集成测试。
2.1 编写测试代码
namespace AspNetMVCEssential.Tests.Controllers
{
[TestClass]
public class HomeControllerTest
{
[TestMethod]
public void Index()
{
// Arrange
HomeController controller = new HomeController();
// Act
ViewResult result = controller.Index() as ViewResult;
// Assert
Assert.IsNotNull(result);
}
[TestMethod]
public void About()
{
// Arrange
HomeController controller = new HomeController();
// Act
ViewResult result = controller.About() as ViewResult;
// Assert
Assert.AreEqual("Your application description page.", result.ViewBag.Message);
}
[TestMethod]
public void Contact()
{
// Arrange
HomeController controller = new HomeController();
// Act
ViewResult result = controller.Contact() as ViewResult;
// Assert
Assert.IsNotNull(result);
}
}
}
2.2 运行测试
选定菜单“测试”->“运行”->运行所有测试或者未成功的测试。
可以在“测试”->“窗口”->“测试资源管理器”中对测试进行管理。
3 Mock测试
Mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。
我们要对TransactionController.cs进行测试,直接操作数据库不行,怎么办呢?我们可以使用虚拟的接口来进行测试。这需要我们更改一些代码.
3.1 首先,我们更改TransactionController.cs
更改db为IApplicationDbContext类型,并且添加构造方法:
private IApplicationDbContext db;
//实际使用
public TransactionController()
{
db = new ApplicationDbContext();
}
//生成使用
public TransactionController(IApplicationDbContext dbContext)
{
db = dbContext;
}
3.2 创建IApplicationDbContext对象
public interface IApplication
{
IDbSet<CheckingAccount> CheckingAccounts{get;set;}
IDbSet<Transaction> Transactions{get; set;}
public int SaveChanges();
}
让实际的ApplicationDbContext实现IApplicationDbContext。
另外创建一个假的FakeApplicationDbContext实现IApplicationDbContext
public class FakeApplicationDbContext:IApplicationDbContext
{
IDbSet<CheckingAccount> CheckingAccounts{get;set;}
IDbSet<Transaction> Transactions{get; set;}
public int SaveChanges(){return 0}
}
再创建一个FakeDbSet
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EntityExtensions {
public class FakeDbSet<T> : System.Data.Entity.IDbSet<T> where T : class {
private readonly List<T> list = new List<T>();
public FakeDbSet() {
list = new List<T>();
}
public FakeDbSet(IEnumerable<T> contents) {
this.list = contents.ToList();
}
#region IDbSet<T> Members
public T Add(T entity) {
this.list.Add(entity);
return entity;
}
public T Attach(T entity) {
this.list.Add(entity);
return entity;
}
public TDerivedEntity Create<TDerivedEntity>() where TDerivedEntity : class, T {
throw new NotImplementedException();
}
public T Create() {
throw new NotImplementedException();
}
public T Find(params object[] keyValues) {
throw new NotImplementedException();
}
public System.Collections.ObjectModel.ObservableCollection<T> Local {
get {
throw new NotImplementedException();
}
}
public T Remove(T entity) {
this.list.Remove(entity);
return entity;
}
#endregion
#region IEnumerable<T> Members
public IEnumerator<T> GetEnumerator() {
return this.list.GetEnumerator();
}
#endregion
#region IEnumerable Members
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return this.list.GetEnumerator();
}
#endregion
#region IQueryable Members
public Type ElementType {
get { return this.list.AsQueryable().ElementType; }
}
public System.Linq.Expressions.Expression Expression {
get { return this.list.AsQueryable().Expression; }
}
public IQueryProvider Provider {
get { return this.list.AsQueryable().Provider; }
}
#endregion
}
}
另外一种方法是使用
Install-Package FakeDbSet
4 TDD
4.1 TDD基本流程
创建失败的测试
用最简单的方法实现
优化
4.2 创建测试
注意,测试应该也引用EF。
ASP.NET MVC5 学习笔记-5 测试的更多相关文章
- ASP.NET MVC5学习笔记01
由于之前在项目中也使用MVC进行开发,但是具体是那个版本就不是很清楚了,但是我觉得大体的思想是相同的,只是版本高的在版本低的基础上增加了一些更加方便操作的东西.下面是我学习ASP.NET MVC5高级 ...
- ASP.NET MVC5 学习笔记-1 控制器、路由、返回类型、选择器、过滤器
[TOC] 1. Action 1.1 新建项目 新建项目->Web->Asp.net Web应用程序,选择MVC,选择添加测试. 在解决方案上右键,选择"管理NuGet程序包& ...
- ASP.NET MVC5学习笔记之Filter提供体系
前面我们介绍了Filter的基本使用,但各种Filter要在合适的时机运行起来,需要预先准备好,现在看看ASP.NET MVC框架是怎么做的. 一.Filter集合 在ControlerActionI ...
- ASP.NET MVC5学习笔记之Controller同步执行架构分析
在开始之前,声明一下,由于ASP.NET MVC5正式发布了,后面的分析将基于ASP.NET MVC5最新的源代码.在前面的内容我们分析了怎样根据路由信息来确定Controller的类型,并最终生成C ...
- ASP.NET MVC5 学习笔记-2 Razor
1. Razor @*注释*@ 你在用 @Request.Browser.Browser, 发送邮件给support@qq.com, 转义@@qq @{ var amounts = new List& ...
- ASP.NET MVC5学习笔记之Filter基本介绍
Filter是ASP.NET MVC框架提供的基于AOP(面向方面)设计,提供在Action执行前后做一些非业务逻辑通用处理,如用户验证,缓存等.现在来看看Filter相关的一些类型信息. 一.基本类 ...
- ASP.NET MVC5学习笔记之Action参数模型绑定之模型元数据和元数据提供
一. 元数据描述类型ModelMetadata 模型元数据是对Model的描述信息,在ASP.NET MVC框架中有非常重要的作用,在模型绑定,模型验证,模型呈现等许多地方都有它的身影.描述Model ...
- ASP.NET MVC5学习笔记之Action参数模型绑定基本过程
当我们在Controller中定义一个Action,通常会定义一个或多个参数,每个参数称为一个模型,ASP.NET MVC框架提供了一种机制称为模型绑定,会尝试自动从请求的信息中实例化每一个模型并赋值 ...
- ASP.NET MVC5 学习笔记-4 OWIN和Katana
1. Owin OWIN全名:Open Web Interface for .NET. 它是一个说明,而非一个框架,该声明用来实现Web服务器和框架的松耦合.它提供了模块化.轻量级和便携的设计.类似N ...
随机推荐
- ZooKeeper源码阅读(二):客户端
源代码: http://svn.apache.org/repos/asf/zookeeper/trunk/ 导入eclipse: 在包含build.xml目录下执行ant eclipse将产生.cla ...
- UI_拖动View
方法一 在touchesMoved中 // 获取到触摸的手指 UITouch *touch = [touches anyObject]; // 获取集合中对象 // 获取開始时的触摸点 CGPoint ...
- spring NotWritablePropertyException异常
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'userDao' of bea ...
- javaScript 工作必知(七) 对象继承
对象继承inherit var o = { r: 1 }; var c = function f() { }; c.prototype = o; c.r = 3; alert(o.r);//被继承的属 ...
- 编写可维护的JS 04
4.变量.函数和运算符 变量 变量声明提前,单var 函数声明 先声明fn再执行 函数声明不应出现在语句块中 函数调用间隔 函数名与左括号间无间隔 立即调用函数 (fuction(){}) 严格模式 ...
- 动态加载 js
要实现动态加载JS脚本有4种方法: 1.直接document.write <script language="javascript"> document.write(& ...
- java中log4j的使用体验
log4j相信大部分java开发者都已经很熟悉了,在此记录下自己的使用过程. 一.文件准备: 1.log4j.jar(我这里使用的版本是log4j-1.2.17.jar,在附件中提供下载) 2.log ...
- 在win7下装ubuntu(硬盘版安装)及遇到的问题
都怪自己弄什么Ubuntu下的Android Studio,因为GFW,gradle总下载不了,用命令行下载一半关机了,然后Ubuntu就这样被我搞残废了.又张罗着重装. 其实就是参照网上的帖子,算是 ...
- asp.net mvc中匿名类dynamic
dynamic info = new { name="aa", sex=“男”, age= }; //返回Model为info在前台中model.name报错,因为匿名类型默认访问 ...
- 笔记-linux下Qt5.3.2 静态编译
这里主要讲linux下的编译,windows下面比较简单 参考:http://qt-project.org/wiki/Building-Qt-5-from-Git 依赖 sudo apt-get in ...