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 测试的更多相关文章

  1. ASP.NET MVC5学习笔记01

    由于之前在项目中也使用MVC进行开发,但是具体是那个版本就不是很清楚了,但是我觉得大体的思想是相同的,只是版本高的在版本低的基础上增加了一些更加方便操作的东西.下面是我学习ASP.NET MVC5高级 ...

  2. ASP.NET MVC5 学习笔记-1 控制器、路由、返回类型、选择器、过滤器

    [TOC] 1. Action 1.1 新建项目 新建项目->Web->Asp.net Web应用程序,选择MVC,选择添加测试. 在解决方案上右键,选择"管理NuGet程序包& ...

  3. ASP.NET MVC5学习笔记之Filter提供体系

    前面我们介绍了Filter的基本使用,但各种Filter要在合适的时机运行起来,需要预先准备好,现在看看ASP.NET MVC框架是怎么做的. 一.Filter集合 在ControlerActionI ...

  4. ASP.NET MVC5学习笔记之Controller同步执行架构分析

    在开始之前,声明一下,由于ASP.NET MVC5正式发布了,后面的分析将基于ASP.NET MVC5最新的源代码.在前面的内容我们分析了怎样根据路由信息来确定Controller的类型,并最终生成C ...

  5. ASP.NET MVC5 学习笔记-2 Razor

    1. Razor @*注释*@ 你在用 @Request.Browser.Browser, 发送邮件给support@qq.com, 转义@@qq @{ var amounts = new List& ...

  6. ASP.NET MVC5学习笔记之Filter基本介绍

    Filter是ASP.NET MVC框架提供的基于AOP(面向方面)设计,提供在Action执行前后做一些非业务逻辑通用处理,如用户验证,缓存等.现在来看看Filter相关的一些类型信息. 一.基本类 ...

  7. ASP.NET MVC5学习笔记之Action参数模型绑定之模型元数据和元数据提供

    一. 元数据描述类型ModelMetadata 模型元数据是对Model的描述信息,在ASP.NET MVC框架中有非常重要的作用,在模型绑定,模型验证,模型呈现等许多地方都有它的身影.描述Model ...

  8. ASP.NET MVC5学习笔记之Action参数模型绑定基本过程

    当我们在Controller中定义一个Action,通常会定义一个或多个参数,每个参数称为一个模型,ASP.NET MVC框架提供了一种机制称为模型绑定,会尝试自动从请求的信息中实例化每一个模型并赋值 ...

  9. ASP.NET MVC5 学习笔记-4 OWIN和Katana

    1. Owin OWIN全名:Open Web Interface for .NET. 它是一个说明,而非一个框架,该声明用来实现Web服务器和框架的松耦合.它提供了模块化.轻量级和便携的设计.类似N ...

随机推荐

  1. WPF 采用Border创建圆角

    通过设置可以创建圆角border的CornerRadius属性其边框呈现圆角样式 代码: <Border Height="50" Background="Red&q ...

  2. iOS 开发 UI 搭建心得(一)—— 驾驭 StoryBoard

    本系列文章中,我们将一起认识.了解当下 iOS 开发中几种常见的 UI 构建方式,分析他们分别适合的使用场景,以便让我们在以后的开发中,能够在恰当的时间.场景下做出最佳的选择,提升开发效率,增强程序的 ...

  3. servlet生成随机验证码

    package com.cgyue; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import jav ...

  4. js获取当前年月日

    function GetDate(){ var now = new Date(); var year = now.getFullYear();        //年var month = now.ge ...

  5. Qt QToolTip 控件背景的 QSS 设置方法(摘抄)

    Qt/C++/CSS: QTooltip stylesheet background colour Hi there, I've recently come across a problem deve ...

  6. Hibernate学习

    一.Hibernate与触发器协同工作 Hibernate与数据库中的触发器协同工作,会造成两类问题 ----触发器使Session的缓存中的持久化对象与数据库中对应的数据不一致:触发器运行在数据库中 ...

  7. apktool 反翻译错误

    -出现 UndefinedResObject Exception : 这是因为被反编译的apk中有当前的framework不支持的属性:解决方式如下: 1.删除C:\Users\Administrat ...

  8. hdu 1806 Frequent values 线段树

    题目链接 给一个非递减数列, n个数, m个询问, 每个询问给出区间[L, R], 求这个区间里面出现次数最多的数的次数. 非递减数列, 这是最关键的一个条件... 需要保存一个区间最左边的数, 最右 ...

  9. (转)C++笔记:面向对象编程基础

    非常棒的总结 http://blog.csdn.net/liufei_learning/article/details/21312701 面向对象编程基础 面向对象编程基于三个基本概念: 数据抽象-类 ...

  10. Spring-AOP实践

    Spring-AOP实践 公司的项目有的页面超级慢,20s以上,不知道用户会不会疯掉,于是老大说这个页面要性能优化.于是,首先就要搞清楚究竟是哪一步耗时太多. 我采用spring aop来统计各个阶段 ...