ASP.NET MVC 5 (八) Visual Studio单元测试

Microsoft Visual Studio 2010 新建和运行 mvc web应用程序 Microsoft Visual Studio 2010 新建和运行 mvc web应用程序        使用Visual Studio 2010编写web项目,常见是使用mvc编程模式,工作的第一步是须学会新建mvc web一个项目,启动运行项目,看到运行效果。 1.新建项目 (1)执行“新建/项目”。 (2)选择ASP.Net MVC 2 Web 应用程序。 阅读详情

这里记录如何使用Visual Studio的内置单元测试

准备示例

这里继续使用上一篇使用的EssensialTools项目做演示。不过需要对IDiscountHelper接口添加一个新的实现,在Models文件夹内添加一个MinimumDiscountHelper的类文件,修改其内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace EssensialTools.Models
{
    public class MinimumDiscountHelper : IDiscountHelper
    {
        public decimal ApplyDiscount(decimal totalParam)
        {
           throw new ArgumentOutOfRangeException();

        }
    }
}

它对不同价格总额采取不同的折扣:

  • 总额大于¥100的,折扣为10%
  • 总额介于¥100到¥10(包括100和10)的,折扣为¥5
  • 总额小于¥10的,无折扣
  • 总额为负值时,抛出一个ArgumentOutOfRangeException异常
    但暂时没有实现任何行为。Adam Freeman遵循测试驱动开发(TDD)方法编写单元测试并随之编写实现代码。

创建单元测试项目

为EssensialTools项目添加单元测试项目的步骤是,在解决方案资源管理器的顶级条目(”EssensialTools”的解决方案)右键选择添加新项目(New Project),也可以在创建MVC项目的同时添加单元测试—-在MVC项目选择的对话框中,有一个“Add Unit Tests”(添加单元测试)选项。
在打开的对话框,在左侧面板的“Visual C#”中选择“Test”,并在中间面板中选择“Unit Test Project(单元测试项目)”,将项目名称设置为EssensialTools.Tests然后点击确定。

添加项目引用

添加之后会在解决方案资源管理器中看到添加的单元测试,但此时还需要添加对一个应用程序项目的引用,使单元测试能够调用这个项目中的类进行测试。方法是,在EssensialTools.Tests项目的References上右键,选择添加引用(Add references),在打开的面板左侧选择Solution,选中右侧的EssensilTools项目,然后点击确定即可。

添加单元测试

第一个单元测试

然后我们可以在EssensialTools.Tests的UnitTest.cs中添加单元测试了,将其内容修改为如下内容:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using EssensialTools.Models;

namespace EssensialTools.Tests
{
    [TestClass]
    public class UnitTest1
    {

        private IDiscountHelper getTestObject()
        {
            return new MinimumDiscountHelper();
        }

        [TestMethod]
        public void Discount_Above_100()
        {
            //准备 arrange
            IDiscountHelper target = getTestObject();
            decimal total = 200;

            //动作 act
            var discountedTotal = target.ApplyDiscount(total);

            //断言
            Assert.AreEqual(total * 0.9M, discountedTotal);
        }
    }
}

我们只添加了一个单元测试,含有测试类的类使用TestClass注解属性进行注释的,其中的各个测试都是用TestMethod注解属性进行注释的方法。当然并不是所有的方法都是单元测试,比如getTestObject方法。要注意的时要添加using EssensialTools.Models;代码引入命名空间。
考察上面的单元测试方法,它是采用“准备(Arrange)”-“动作(Act)”-“断言(Assert)”三部分组成。

  • 准备,调用getTestObject方法返回一个IDiscountHelper 接口的实现类MinimumDiscountHelper的实例,定义表示总价的变量total并给定初值200。
  • 动作,使用接口(或实现类)的ApplyDiscount方法计算折扣后的总价并赋值给discountedTotal
  • 断言,通过 Assert.AreEqual方法判断通过接口实现的方法计算之后的值和它应当得出的值是否相等,如果不相等则抛出异常。

Assert类还有诸多在单元测试中使用的静态方法,从MSDN中https://msdn.microsoft.com/zh-cn/library/microsoft.visualstudio.testtools.unittesting.assert.aspx 可以查看。

添加其他单元测试

上述内容中给出测试超过¥100的折扣测试方法,现在在UnitTest1类中添加其他条件下的测试方法:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using EssentialTools.Models;

namespace EssiontialTools
{
    [TestClass]
    public class UnitTest1
    {

        private IDiscountHelper getTestObject()
        {
            return new MinimumDiscountHelper();
        }

        [TestMethod]
        public void Discount_Above_100()
        {
            //准备 arrange
            IDiscountHelper target = getTestObject();
            decimal total = 200;

            //动作 act
            var discountedTotal = target.ApplyDiscount(total);

            //断言
            Assert.AreEqual(total * 0.9M, discountedTotal);
        }

        [TestMethod]
        public void Discount_Between_10_And_100()
        {
            //准备 arrange
            IDiscountHelper target = getTestObject();

            //动作 act
            decimal TenDollarDiscount = target.ApplyDiscount(10);
            decimal HundredDollarDiscount = target.ApplyDiscount(100);
            decimal FiftyDollarDiscount = target.ApplyDiscount(50);

            //断言
            Assert.AreEqual(5,TenDollarDiscount,"$10 discount is wrong");
            Assert.AreEqual(95, HundredDollarDiscount, "$100 discount is wrong");
            Assert.AreEqual(45, FiftyDollarDiscount, "$50 discount is wrong");

        }

        [TestMethod]
        public void Discount_Less_Than_10()
        {
            //准备 arrange
            IDiscountHelper target = getTestObject();

            //动作 act
            decimal discount5 = target.ApplyDiscount(5);
            decimal discount0 = target.ApplyDiscount(0);

            //断言
            Assert.AreEqual(5, discount5);
            Assert.AreEqual(0, discount0);
        }

        [TestMethod]
        [ExpectedException(typeof(ArgumentOutOfRangeException))]
        public void Discount_Negative_Total()
        {
            //准备 arrange
            IDiscountHelper target = getTestObject();

            //动作 act
            target.ApplyDiscount(-1);


        }
    }
}

运行单元测试并发现错误

Visual Studio提供了”Test Explorer(测试资源管理器)”,用于管理和运行单元测试,从“Test(测试)”菜单中选择“Windows(窗口)”->“Test Explorer(测试资源管理器)”便可以显示出来。然后点击该窗口左上角的”Run All(全部运行)”可以看到测试结果如图:
第一此运行单元测试并发现错误

实现特性

可以看到结果显示,有三个测试结果出现错误,超过100、100~10之间和小于10的折扣出现错误,这是因为我们的实现类MinimumDiscountHelper并没有实现当初预定的算法特性。
然后我们根据要求修改MinimumDiscountHelper的ApplyDiscount方法如下:

 public decimal ApplyDiscount(decimal totalParam)
        {
            if (totalParam < 0)
            {
                throw new ArgumentOutOfRangeException();
            }
            else if (totalParam > 100)
            {
                return totalParam * 0.9M;
            }
            else if (totalParam > 10 && totalParam <= 100)
            {
                return totalParam - 5;
            }
            else
            {
                return totalParam;
            }
        }

测试并修正代码

重新运行全部测试,这时发现有一个测试并没有通过,可以看到错误提示为 :

Result Message: Assert.AreEqual failed. Expected:<5>. Actual:<10>. $10 discount is wrong

说明希望得到的测试值是5,但实际得到的值是10。此时则需要重审代码,会发现ApplyDiscount设置的10~100之间的算法并没有包含10这一数值。修正原有代码else if (totalParam > 10 && totalParam <= 100)为else if (totalParam >= 10 && totalParam <= 100),然后重新运行测试会发现测试成功。
在MSDN上https://msdn.microsoft.com/zh-cn/library/dd264975.aspx 有VS的单元测试的详细介绍。

全面掌握ASP.NET MVC+EF+EasyUI的信息管理系统开发 ASP.NET MVC框架是微软.NET平台的一部分,它支持开发者构建动态的Web应用。通过MVC模式,将应用分为三个主要组件:模型(Model):处理数据和业务逻辑。视图(View):向用户展示数据的界面。控制器(Controller):处理用户输入,与模型交互,并选择视图进行渲染。ASP.NET MVC不仅支持强类型视图,还允许使用Razor视图引擎,提高开发效率,同时它与.NET Framework的其他部分如Entity Framework无缝集成。 阅读详情

相关推荐

Windows 7系统下ASP.NET环境搭建指南

在本章节中,我们将概述在Windows 7操作系统上搭建ASP.NET开发环境的基本步骤和要求。ASP.NET,作为.NET框架中的一部分,允许开发者构建动态网站、Web应用程序和服务。为了在Win7上进行高效的ASP.NET开发,重要的是确保系统满足.NET框架和IIS(Internet Information Services)的最低要求。.NET Framework是微软开发的一个旨在简化各种应用程序(Windows客户端应用程序和ASP.NET Web应用程序)的开发与部署的软件框架。

weixin_42607969的博客 1185

基于VS平台的单元测试

基于VS平台的单元测试

weixin_42077793的博客 1942

技术美术个人笔记(十三)——Houdini金属弯曲模拟

最近接收到使用Houdini自动解算破损/砸坏/扭曲汽车的需求,以此文记录制作金属弯曲自动解算工具时使用的部分节点解析;

小谁的博客 2147

Asp.Net单元测试

[b]一 单元测试简介[/b] 单元测试是代码正确性验证的最重要的工具,也是系统测试当中最重要的环节。也是唯一需要编写代码才能进行测试的一种测试方法。在标准的开发过程中,单元测试的代码与实际程序的代码具有同等的重要性。每一个单元测试,都是用来定向测试其所对应的一个单元的数据是否正确。 单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能...

yangpingzhun的博客 382

AI协议助手:法律文本解析与智能问答技术解析

自然语言处理(NLP)技术在法律文本解析中展现出巨大潜力,通过BERT等预训练模型实现条款分类与语义理解。结合OCR与知识图谱技术,AI协议助手能快速提取合同核心条款,并以问答形式解释法律术语,显著提升商务场景的决策效率。测试数据显示,该系统对NDA协议的识别准确率达92%,响应时间仅1.2秒,特别适用于人力资源竞业协议、云服务SLA评估等场景。随着RAG架构与法律术语向量库的应用,AI+法律正推动合同审核成本下降67%,未来将在跨境合规、智能谈判等方向持续演进。

weixin_29053577的博客 125

NE5532A与JRC4580在低噪声音频电路设计中的关键应用

本文深入探讨了经典运算放大器NE5532A与JRC4580在低噪声音频电路设计中的核心应用。文章从噪声模型分析入手,阐述了针对低阻抗信号源时,如何利用这两款BJT输入运放的低电流噪声特性进行优化设计。通过对比两者参数与实战守则,为设计高保真音频前级、耳机放大等电路提供了从原理图到PCB布局的完整低噪声解决方案。

weixin_29295541的博客 326

Selenium ChromeDriver反爬与性能优化实战指南

ChromeDriver作为Selenium的核心驱动,本质是浏览器自动化执行引擎,其默认行为会暴露大量JS运行时指纹(如navigator.webdriver、window.chrome),极易被前端反爬系统识别;同时因进程管理粗放、渲染等待机制僵化,导致内存泄漏、僵尸进程和高并发下稳定性崩塌。本文围绕真实生产场景,系统解析浏览器指纹伪造原理、进程级资源管控策略、基于页面状态的智能等待范式,并提供Docker容器化、K8s弹性扩缩与Prometheus可观测性落地路径,助力开发者将ChromeDriver

weixin_29762151的博客 1259

.Net 测试专题介绍

本文介绍.Net后端开发人员如何使用VS进行各种测试,以及面向测试的编程思想(TDD),还介绍了借助第三方国产类postman测试工具进行前后端团队开发、测试流程的整合和最佳实践,还有适合.Neter使用的压力测试、UI测试等等。

578

使用Microsoft Print to PDF进行编程:创建PDF文件的简单方法

Microsoft Print to PDF是一种内置于Windows操作系统中的功能,它允许我们通过打印操作将任何可打印的内容保存为PDF文件。然后,我们使用Microsoft Print to PDF打印机进行打印操作,并将输出文件保存为指定的PDF文件。使用Microsoft Print to PDF功能是一种方便且简单的方法来创建PDF文件,无论是在个人使用还是在企业开发中,它都可以提供良好的支持和灵活性。请注意,如果你使用的是其他编程语言,你可以根据相应的打印机接口或库来实现类似的功能。

TechSavant的博客 1634

华为OD干了两个月,还是跑了

​本人工作了快13年,base南京。2024年2月份由于公司业务变动第一次拿到了公司发的大礼包,同时也面临着失业的问题,我对自己的技术还是很有信心的,但是,找了大概有一个多月时间,发现心意的工作的确不太好找,当然收到挺多家offer,就是薪资不太满意,外包也一直不想去,不过说实话外包给的薪资普遍要比自研的单位要高一些,最后为了钱还是进华为(既然选择外包那就选择好一些的吧),毕竟中年老男人工作不能断太久。

啊渊的专栏 1万+

【ASP.NET Core 基础知识】--测试--单元测试和集成测试

单元测试是软件开发中的一种测试方法,用于验证软件中的最小可测试单元——通常是函数、方法或类——的行为是否符合预期。它的核心思想是将程序分解成独立的单元,并针对每个单元编写测试用例,以验证其功能是否正确。测试最小单元:单元测试针对软件中的最小可测试单元进行测试,通常是函数、方法或类。这有助于隔离问题,提高调试效率。自动化执行:单元测试通常是自动化执行的,即通过编写测试代码来验证单元的行为。这使得测试过程可以快速、频繁地执行,提高了开发效率。独立性。

喵叔 3584

【实践】VECTOR AUTOSAR创建SWC读写CAN信号

在AUTOSAR开发中最必要的功能就是读写CAN信号,本文通过一步步说明,介绍如何开发SWC来读写CAN信号,可以说在AUTOSAR中实现读写CAN信号的实践过程,是一个非常基础且典型的练习。在本篇文章阅读之前,推荐阅读AUTOSAR RTE介绍,本篇文章介绍了RTE的比较全面的介绍了AUTOSAR RTE。理解了RTE之后,才能对SWC的设计更加清楚。话不多说,接着上一篇内容VECTOR DaVinci从0到1搭建工程,此篇文章我们介绍如何在DaVinci Developer中开发SWC访问CAN信号。为

酒无忧的博客 1228

VS2017创建ASP.NET MVC项目——asp.net mvc笔记(1)

    写在前面的话:     年后要去做.net web方面的实习,所有现在趁放假折腾一下aps.net。    之前我学过webform模式,但是现在mvc比较流行,所以我找了一些mvc方面的教程,结合一年前asp网站开发课程的ppt再"预习"一下,都是些很简单的demo,主要是为了记录和分享,还请大佬轻喷!       开始     第一步,打开VS2017(我用社区版,装好了ASP...

renaway的博客 1万+

本文将详细介绍如何在 Qt (C++) 应用程序中集成 osgEarth,加载三维数字地球,并在指定经纬度添加三维模型(如飞机、建筑等)。

OSG 与 Qt 的交互通常需要处理 OpenGL 上下文。osgEarth 3.x 提供了对 Qt 的较好支持,或者可以使用。在普通 OSG 程序中,你需要手动处理坐标系转换将经纬度转为笛卡尔坐标 (XYZ)。这是实现的关键,将 OSG 的渲染循环集成到 Qt 的事件循环中。第三方库,但在本教程中,我们将展示一种通过继承。,将 Qt 的输入事件转换为 OSG 理解的。事件,这是实现交互(旋转地球、缩放)的基础。来嵌入 OSG 视图的标准方法。在这里我们初始化地球并添加模型。节点简化了这一过程。

qq_45859163的博客 1044

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

这本694页的程序员砖头书让你精通ASP.NET Core MVC

ASP.NET Core MVC是一个来自微软的Web应用程序开发框架,它结合了模型-视图-控制器(MVC)体系结构的有效性和整洁性、敏捷开发的想法和技术,以及.NET平台的最佳部分。 1.1 ASP.NET Core MVC的历史 最早的ASP.NET是在2002年推出的,当时微软热衷于保护其在传统桌面应用程序开发中的主导地位,并将互联网视为威胁。图1-1说明了当时出现的ASP.NET Web Forms技术栈。 图1-1 ASP.NET Web Forms技术栈 1.1.1 ASP.N.

人邮异步社区 992

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【MVC 4】4.MVC 基本工具(Visual Studio 的单元测试、使用Moq)

作者:[美]Adam Freeman 来源:《精通ASP.NET MVC 4》 3.Visual Studio 的单元测试 有很多.NET单元测试包,其中很多是开源和免费的。本文打算使用 Visual Studio 附带的内建单元测试支持,但其他一些.NET单元测试包也是可用的。 为了演示Visual Studio的单元测试支持,本例打算对示例项目添加一个IDisco...

235

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

ASP.NET MVC (一)——深入理解ASP.NET MVC

ASP.NET vs MVC vs WebForms 许多ASP.NET开发人员开始接触MVC认为MVC与ASP.NET完全没有关系,是一个全新的Web开发,事实上ASP.NET是创建WEB应用的框架而MVC是能够用更好的方法来组织并管理代码的一种更高级架构体系,所以可以称之为ASP.NET MVC。 我们可将原来的ASP.NET称为 ASP.NET Webforms,新的MVC 称为ASP....

Cool2Feel的博客 607

Visual Studio 2013 Web开发

cnbeta新闻:微软正式发布Visual Studio 2013 RTM版,微软还发布了Visual Studio 2013的最终版本、.NET 4.5.1以及Team Foundation Server 2013。下面我们体验下Visual Studio 2013 Web开发方面有哪些特性,具体可以参看http://www.asp.net/visual-studio/overview/2013

btest_01的专栏 1208

视频教程-ASP.NET MVC 开发企业级应用-----安全、单元测试及部署-.NET

ASP.NET MVC 开发企业级应用-----安全、单元测试及部署 尹国艳...

weixin_32572703的博客 319

图解使用VS 2017创建ASP.NET MVC单元测试项目

打开VS 2017,依次选择菜单栏中的“文件”->“新建”->“项目”,如下图所示: 在新建对话框中依次选择“Visual C#”->“Web”->“ASP.NET Web应用 程序(.NET Framework)”,如下图所示: ASP.NET 4.5模板选择MVC,千万要记得勾选“添加单元测试”,如下图所示: ...

xulong5000的专栏 447

ASP.NET MVC 2/3 分离架构下的智能脚手架实现

在 ASP.NET MVC 框架中,分离式架构(Controllers/Views 物理拆分)虽提升模块化与可维护性,却导致默认脚手架失效、视图定位失败、跨程序集模型推导困难等核心开发体验断层。其本质是 MVC 视图查找机制、编译期类型解析与 Visual Studio 项目系统三者协同失配。本方案基于官方 Scaffolder 扩展点,通过动态程序集加载、反射元数据提取、自定义 ViewLocationFormats 与 VSIX 插件集成,实现右键即生成控制器与强类型 Razor 视图的能力。技术价值在

dianlu5775的博客 461

7、ASP.NET MVC入门到精通——第一个ASP.NET MVC程序

本系列目录:ASP.NET MVC4入门到精通系列目录汇总 开发流程 新建Controller 创建Action 根据Action创建View 在Action获取数据并生产ActionResult传递给View。 View是显示数据的模板 Url请求→Controller.Action处理→View响应 url请求→Controller.Action处理→View响应 开发环境:VS2012...

邹玉杰(邹琼俊)的专栏 150

UnitView:ASP.NET MVC视图单元测试的进程内注入实践

视图单元测试是Web应用可维护性的关键一环,其本质在于验证数据到HTML的映射逻辑是否正确。传统方案依赖字符串比对或跨进程浏览器驱动,导致测试脆弱、调试困难、性能低下。UnitView另辟蹊径,采用同进程(InProc)注入机制,将测试数据直接载入ASP.NET应用域,绕过序列化与网络开销,实现高保真、低延迟、可调试的视图验证。该方法强调ViewData契约先行、隔离真实渲染环境,并天然推动视图层解耦——如消除HttpContext.Current、User.Identity等隐式依赖。适用于ASP.NET

a6t2007的博客 373

光脚丫学ASP.NET MVC(0001):创建ASP.NET MVC应用程序项目

光脚丫思考  QQ:524130780邮箱:524130780@QQ.COM博客:http://blog.csdn.net/GJYSK本演示介绍了如何使用Visual Studio 2010创建ASP.NET MVC应用程序项目。下面是VS的新建项目对话框。其中红色线圈住的两个模

光脚丫思考的专栏 1590

ASP.NET MVC 5 SmartCode Scaffolding for Visual Studio.Net

介绍 ASP.NET MVC 5 SmartCode Scaffolding是集成在Visual Studio.Net开发工具中一个ASP.NET MVC Web应用程序代码生成框架,使用SmartCode Scaffolding可以快速添加一整套View,Controller,Model,Service可以运行的交互式代码。减少程序员在系统开发过程中编写重复的代码行数(估计可以减少80%代码C...

weixin_33777877的博客 129
上一篇: ASP.NET MVC 5 (七-2) Ninject进阶
下一篇: Drone CI:搭建自己CI/CD(一)
DoongBo
博客等级 码龄10年 25粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值