在ASP.NET MVC项目的Controller中存在逻辑代码,也需要单元测试。查阅到的资料上,有说ASP.NET MVC框架在设计时便考虑到了满足可测试性,所以相对aspx、Winform来说针对MVC的单元测试要更容易。

一 基本使用

原来对Controller的单元测试的并不像此前自己想的那么复杂,本质还是对一个代码单元的功能测试。如果不涉及HttpContext的模拟,使用方法基本与之前对Service层的单元测试方法一致,但会多了一些Arrange操作,因为Controller又会调用Service。测试Login的Post动作在验证码错误时的行为的测试代码为:

主要是在刚开始的时候不知道TempData如何设置,原来可以直接这样:auController.TempData[Consts.VERIFY_CODE_KEY] = "VerifyCode_Error",TempData是ControllerBase的属性,而Controller都继承自ControllerBase。

但Session却不能用类似的方法赋值,否则会报空引用错误,Session是只读属性,而且Session应该不在Controller的生命周期内,到底具体怎么做还不知道。


二 模拟HttpContext和HttpRequest

对于单元测试来说,网络与数据库一样都是外部依赖,之前只模拟过数据库,现在可以用类似的方式模拟网络请求了。比如Controller的一个Action需要读取网络请求中的QueryString:

用Substitute.For方法分别模拟了HttpContextBase和HttpRequestBase对象。通过这儿还学到NSubstitute也是能模拟属性的返回值的,与指定方法的返回值时类似:httpRequest.QueryString.Returns(queryString)。

在这段代码中,也可以大概了解ASP.NET MVC中相关对象之间的关系:Controller->ControllerContext->HttpContext->HttpRequest,前者依次包含后者。

代码var result = auController.Index() as ViewResult将Index返回的ActionResult转换为其子类ViewResult,可以针对ViewResult验证Model、ViewBag、ViewData等数据。

对Controller的单元测试的更多相关文章

  1. Spring Boot 2 实践记录之 封装依赖及尽可能不创建静态方法以避免在 Service 和 Controller 的单元测试中使用 Powermock

    在前面的文章中(Spring Boot 2 实践记录之 Powermock 和 SpringBootTest)提到了使用 Powermock 结合 SpringBootTest.WebMvcTest ...

  2. ASP.NET Core 对Controller进行单元测试

    单元测试对我们的代码质量非常重要.很多同学都会对业务逻辑或者工具方法写测试用例,但是往往忽略了对Controller层写单元测试.我所在的公司没见过一个对Controller写过测试的.今天来演示下如 ...

  3. 如何对Spring MVC中的Controller进行单元测试

    对Controller进行单元测试是Spring框架原生就支持的能力,它可以模拟HTTP客户端发起对服务地址的请求,可以不用借助于诸如Postman这样的外部工具就能完成对接口的测试. 具体来讲,是由 ...

  4. MockMvc模拟对controller进行单元测试

    本文为博主原创,未经允许不得转载:  MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快.不依赖网络环境, 而且提供了一套验证的 ...

  5. 【maven】【spring boot】【单元测试】 使用controller 执行单元测试类

    存在这样一个场景: 当项目启动时间过长,又没办法缩短的时候,写单元测试就是一个十分耗时的工作, 这工作不在于使用编写代码,而在于每次run junit test 都需要完整启动一次项目,白白浪费宝贵的 ...

  6. 使用Spring MockMVC对controller做单元测试(转)

    https://www.cnblogs.com/ylty/p/6420738.html 1.对单一controller做测试. import org.junit.Before; import org. ...

  7. MockMvc 进行 controller层单元测试 事务自动回滚 完整实例

    package com.ieou.ms_backend.controller; import com.google.gson.Gson; import com.ieou.ms_backend.dto. ...

  8. 使用Spring MockMVC对controller做单元测试

    1.对单一controller做测试. import org.junit.Before; import org.junit.Test; import org.springframework.beans ...

  9. springBoot中“MockMvc”的进行Controller进行单元测试:application/octet-stream' not supported问题小结

    解决方案:这个问题其实是Content-type的问题,只需要在相关的代码加入相关Content-type中就可以了,代码如下: mockMvc.perform(post("/user&qu ...

随机推荐

  1. Matlab中常见的神经网络训练函数和学习函数

    一.训练函数 1.traingd Name:Gradient descent backpropagation (梯度下降反向传播算法 ) Description:triangd is a networ ...

  2. 输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

  3. 分享一套简单的CodeSmith三层模板

    如果要连接mysql,需要安装驱动: https://cdn.mysql.com//Downloads/Connector-Net/mysql-connector-net-8.0.12.msi 连接字 ...

  4. 帝国CMS-后台使用

    后台管理----- 网址wxtoupiao111.com 后台http://wxtoupiao111.com/e/admin/账号密码认证码admin 数据库 账号root  密码空http://wx ...

  5. js便签笔记(10) - 分享:json2.js源码解读笔记

    1. 如何理解“json” 首先应该意识到,json是一种数据转换格式,既然是个“格式”,就是个抽象的东西.它不是js对象,也不是字符串,它只是一种格式,一种规定而已. 这个格式规定了如何将js对象转 ...

  6. 常见hash原理

    原文出处:http://www.itmian4.com/forum.php?mod=viewthread&tid=4736&fromuid=1 散列表,它是基于快速存取的角度设计的,也 ...

  7. INTEST/EXTEST SCAN

    INTEST scan指的是对IP 内部的scan cell的扫描测试,针对IP内部的flip-flop进行shift/capture的操作.和INTEST SCAN 对应的就是EXTEST SCAN ...

  8. 第四章 使用Servlet处理HTTP请求

      回顾上一章的知识: 请求网络资源HTTP会发出多个请求并得到响应 设置响应状态行关键是设置状态码 在向客户端输出内容之前要设置状态码和响应头 设置响应头让Servlet发挥最大功能 消息体可以用文 ...

  9. 利用latex制作个人简历

    转自: http://www.cnblogs.com/panpei/ 前些日子,有点无聊,就在网上逛逛技术大牛的blogs,发现很多大牛都喜欢用pdf版式的简历,发现这种版式的简历排版非常漂亮简洁.深 ...

  10. 微服务之kong+consul(二)

    一.kong 1.使用kong来做服务网关,目前kong使用的是0.13版本现在地址:https://docs.konghq.com/install,kong的社区版没有dashboard,可以使用k ...