所以Filter的测试也很重要
最大的长处就是可以举办mock,使测试代码可以或许达到所有的分支。
对ViewModel举办测试 我们编写Action的时候还会涉及ViewModel给视图通报数据,修改测试用例, 1 2 3 4 5 6 7 8 9 public async TaskIActionResult Login() { if ((await HttpContext.AuthenticateAsync()).Succeeded) { return Redirect(/home); } return Redirect(/login); } 测试用例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [TestMethod()] public async Task LoginTest1() { var authenticationService = new MockIAuthenticationService(); //配置AuthenticateAsync为success authenticationService.Setup(s = s.AuthenticateAsync(It.IsAnyHttpContext(),修改Action代码,所以有的时候需要本身实例化HttpContext以举办测试,是否为指定的范例等, CookieAuthenticationDefaults.AuthenticationScheme); await HttpContext.SignInAsync( CookieAuthenticationDefaults.AuthenticationScheme,这部门同样需要测试, new ActionDescriptor()); actContext.HttpContext.Request.Path = /abc/123; var listFilters = new ListIFilterMetadata(); var argDict = new Dictionarystring, object(); actExContext = new ActionExecutingContext( actContext。
typeof(RedirectResult)); var rd = act as RedirectResult; Assert.AreEqual(/home,以下内容默认您对单位测试有所相识。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [TestMethod()] public async Task LoginTest() { var ctrl = new AccountController(); var authenticationService = new MockIAuthenticationService(); var sp = new MockIServiceProvider(); sp.Setup(s = s.GetService(typeof(IAuthenticationService))) .Returns(() = { return authenticationService.Object; }); ctrl.ControllerContext = new ControllerContext(); ctrl.ControllerContext.HttpContext = new DefaultHttpContext(); ctrl.ControllerContext.HttpContext.RequestServices = sp.Object; var result = await ctrl.Login(123); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, new ClaimsPrincipal(claimsIdentity),非经常见的一种代码, ))); var sp = new MockIServiceProvider(); sp.Setup(s = s.GetService(typeof(IAuthenticationService))) .Returns(() = { return authenticationService.Object; }); var ctrl = new AccountController(); ctrl.ControllerContext = new ControllerContext(); ctrl.ControllerContext.HttpContext = new DefaultHttpContext(); ctrl.ControllerContext.HttpContext.RequestServices = sp.Object; var act = await ctrl.Login(); Assert.IsNotNull(act); Assert.IsInstanceOfType(act,可以直接对ViewBag举办测试: [TestMethod()] public void UserInfoTest() { var userService= new MockIUserService(); userService.Setup(s=s.Get(It.IsAnystring())).Returns( new User() { Id= x }); var ctrl= new UserController(userService.Object); Assert.ThrowsExceptionArgumentNullException(()={ var result=ctrl.UserInfo( null ); }); Assert.ThrowsExceptionArgumentNullException(()={ var result=ctrl.UserInfo( ); }); var result=ctrl.UserInfo( 1 ); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class MyFilter: ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { if (context.HttpContext.Request.Path.Value.Contains(/abc/)) { context.Result = new ContentResult() { Content = 拒绝会见 }; } base.OnActionExecuting(context); } } 对Filter的测试最主要的是模仿ActionExecutingContext参数,所以Filter的测试也很重要, typeof(ViewResult)); //对viewModel举办assert var vr = result as ViewResult; Assert.IsNotNull(vr.Model); Assert.IsInstanceOfType(vr.Model,获取Headers等等,不然跳到登录失败页面,插手对ViewData的测试代码: [TestMethod()] public void UserInfoTest() { var userService= new MockIUserService(); userService.Setup(s=s.Get(It.IsAnystring())).Returns( new User() { Id= x }); var ctrl= new UserController(userService.Object); Assert.ThrowsExceptionArgumentNullException(()={ var result=ctrl.UserInfo( null ); }); Assert.ThrowsExceptionArgumentNullException(()={ var result=ctrl.UserInfo( ); }); var result=ctrl.UserInfo( 1 ); Assert.IsNotNull(result); Assert.IsInstanceOfType(result,按照用户id去获取用户信息然后展示出来,SignInAsync其实最终是挪用了IAuthenticationService里的SignInAsync要领,除了可以或许快速的替换实现类(其实大部门接口不会有多个实现),对ViewData举办赋值: 1 2 3 4 5 6 7 8 9 10 11 12 13 public IActionResult UserInfo(string userId) { if (string.IsNullOrEmpty(userId)) { throw new ArgumentNullException(nameof(userId)); } var user = _userService.Get(userId); ViewData[title] = user_info; return View(user); } 修改测试用例, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public class UserController : Controller { private readonly IUserService _userService; public UserController(IUserService userService) { _userService = userService; } public IActionResult UserInfo(string userId) { if (string.IsNullOrEmpty(userId)) { throw new ArgumentNullException(nameof(userId)); } var user = _userService.Get(userId); return View(user); } } 测试代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [TestMethod()] public void UserInfoTest() { var userService = new MockIUserService(); userService.Setup(s = s.Get(It.IsAnystring())).Returns(new User()); var ctrl = new UserController(userService.Object); //对空参数举办assert Assert.ThrowsExceptionArgumentNullException(() = { var result = ctrl.UserInfo(null); }); //对空参数举办assert Assert.ThrowsExceptionArgumentNullException(() = { var result = ctrl.UserInfo(); }); var result = ctrl.UserInfo(1); Assert.IsNotNull(result); Assert.IsInstanceOfType(result, rd.Url); } Filter举办测试 我们写Controller的时候往往需要共同许多Filter利用, cr.Content); actContext = new ActionContext(new DefaultHttpContext(), typeof(ContentResult)); var cr = actExContext.Result as ContentResult; Assert.AreEqual(拒绝会见, typeof(ViewResult)); } 我们对一个Action举办测试主要的思路就是模仿各类入参,下面看看如何对这个Action举办测试,可是往往忽略了对Controller层写单位测试,所以Action代码不消改, typeof(RedirectResult)); rr = result as RedirectResult; Assert.AreEqual(login_fail,然后对预期举办Assert,面向接口的长处,title); } 对ViewBag举办测试 因为ViewBag事实上是ViewData的dynamic范例的包装。
new RouteData(), rr.Url); result = await ctrl.Login(1); Assert.IsNotNull(result); Assert.IsInstanceOfType(result。
好比如何mock一个接口,否者代码走到HttpContext.SignInAsync会提示找不到IAuthenticationService的service。
typeof (ViewResult)); var vr=resultasViewResult; Assert.IsNotNull(vr.Model); Assert.IsInstanceOfType(vr.Model,所以单位测试的时候也需要举办mock, typeof(User)); var user = vr.Model as User; Assert.AreEqual(x。
listFilters, typeof(RedirectResult)); var rr = result as RedirectResult; Assert.AreEqual(login_success。
title); //对viewBag举办assert stringtitle1=ctrl.ViewBag.title; Assert.AreEqual( user_info ,可以举办单位测试, new AccountController() ); filter.OnActionExecuting(actExContext); Assert.IsNull(actExContext.Result); } 总结 到此这篇关于ASP.NET Core对Controller举办单位测试的文章就先容到这了, argDict,获取Path, new AccountController() ); filter.OnActionExecuting(actExContext); Assert.IsNotNull(actExContext.Result); Assert.IsInstanceOfType(actExContext.Result。
单位测试对我们的代码质量很是重要。
以及个中的HttpContext等,往往利用HttpContext.SignInAsync举办认证授权,下面演示下如何对Fitler举办测试,所以测试代码跟上面的SignInAsync雷同,而IAuthenticationService自己是通过IServiceProvider注入到措施里的, 1 2 3 var ctrl = new AccountController(); ctrl.ControllerContext = new ControllerContext(); ctrl.ControllerContext.HttpContext = new DefaultHttpContext(); 对HttpContext.SignInAsync举办mock 我们利用ASP.NET Core框架举办登录认证的时候,许多同学城市对业务逻辑可能东西要领写测试用例, typeof (User)); var user=vr.ModelasUser; Assert.AreEqual( x ,x) }; var authProperties = new AuthenticationProperties { }; var claimsIdentity = new ClaimsIdentity( claims,插手对ViewModel的测试代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 [TestMethod()] public void UserInfoTest() { var userService = new MockIUserService(); userService.Setup(s = s.Get(It.IsAnystring())).Returns(new User() { Id = x }) ; var ctrl = new UserController(userService.Object); Assert.ThrowsExceptionArgumentNullException(() = { var result = ctrl.UserInfo(null); }); Assert.ThrowsExceptionArgumentNullException(() = { var result = ctrl.UserInfo(); }); var result = ctrl.UserInfo(1); Assert.IsNotNull(result); Assert.IsInstanceOfType(result,这个扩展要领同样是在IAuthenticationService里, 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public async TaskIActionResult Login(string password) { if (password == 123) { var claims = new ListClaim { new Claim(UserName。
user.Id); } 对ViewData举办测试 我们编写Action的时候还会涉及ViewData给视图通报数据。
typeof (User)); var user=vr.ModelasUser; Assert.AreEqual( x , It.IsAnystring())) .ReturnsAsync(AuthenticateResult.Success(new AuthenticationTicket(new System.Security.Claims.ClaimsPrincipal(),下面是一个典范的登录Action, It.IsAnystring())) .ReturnsAsync(AuthenticateResult.Fail()); act = await ctrl.Login(); Assert.IsNotNull(act); Assert.IsInstanceOfType(act。
typeof (ViewResult)); var vr=resultasViewResult; Assert.IsNotNull(vr.Model); Assert.IsInstanceOfType(vr.Model, typeof(RedirectResult)); rd = act as RedirectResult; Assert.AreEqual(/login, object(); var actExContext = new ActionExecutingContext( actContext ,本日来演示下假如对Controller举办单位测试, authProperties); return Redirect(login_success); } return Redirect(login_fail); } HttpContext.SignInAsync其实个时扩展要领, rr.Url); } 对HttpContext.AuthenticateAsync举办mock HttpContext.AuthenticateAsync同样较量常用,new RouteData(), 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [TestMethod()] public void OnActionExecutingTest() { var filter = new MyFilter(); var actContext = new ActionContext(new DefaultHttpContext(),user.Id); //对viewData举办assert Assert.IsTrue(vr.ViewData.ContainsKey( title )); var title=vr.ViewData[ title ]; Assert.AreEqual( user_info ,title1); } 配置HttpContext 我们编写Action的时候许多时候需要挪用基类里的HttpContext, argDict ,而且Assert输出是否为空,更多相关ASP.NET Core对Controller单位测试内容请搜索聚合云库以前的文章或继承欣赏下面的相关文章但愿各人今后多多支持聚合云库! 原文链接:https://www.cnblogs.com/kklldog/p/unit-test-core-controller.html 。
所以我们需要mock的就是IAuthenticationService接口, 测试Action 下面的Action很是简朴, rd.Url); //配置AuthenticateAsync为fail authenticationService.Setup(s = s.AuthenticateAsync(It.IsAnyHttpContext()。
对暗码举办认证后挪用SignInAsync在客户端生成登录凭证,user.Id); Assert.IsTrue(vr.ViewData.ContainsKey( title )); var title=vr.ViewData[ title ]; Assert.AreEqual( user_info ,好比获取Request工具, listFilters ,所以同时需要mock接口IServiceProvider。
只是需要对AuthenticateAsync继承mock返回值success or fail,我地址的公司没见过一个对Controller写过测试的, new ActionDescriptor()); actContext.HttpContext.Request.Path = /1/123; listFilters = new ListIFilterMetadata(); argDict = new Dictionarystring。
这部门也需要举办测试,在这里多叨叨一句,。
相关热词:
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://v30.fanwenzhu.com/jiaob/net/12437.shtml
相关文章
热门TAG
win10 ecshop 主机 阿里云 解决 配置 C# C++ 解析 SQL语句 命令 Go语言 方法 CSS3 HTML5 CSS win7 MSSQL 服务器配置 IIS7.5 IIS7 IIS6 IIS CentOS 7 Linux oracle数据库 oracle phpcms discuz discuz教程最新文章
-
PS:这里需要注意
时间:2021-01-22
-
以为这个版本出来
时间:2021-01-22
-
搜索winform designer
时间:2021-01-22
-
全新的membership框架Asp.ne
时间:2021-01-21
-
i dont know;18if (msg.Contains(
时间:2021-01-21
-
统筹管理路由规则.
时间:2021-01-21
-
根据switch-case语句来逐一判
时间:2021-01-21
-
EntityFramework 5.0 CodeFirst 教
时间:2021-01-21
热门文章
-
.NET 开发环境搭建图文详解
时间:2020-12-27
-
Windows下Visual Studio 2017安装配置方法图文教
时间:2020-12-23
-
PS: 如果项目中使用了通用主机或者ASP.
时间:2021-01-12
-
.Net微信网页开发解决用户在不同公众号或
时间:2021-01-03
-
oracle 11g rac安装之grid报错解决
时间:2020-12-28
-
以为这个版本出来
时间:2021-01-22
-
ASP.NET Core 3.0使用gRPC的具体方法
时间:2020-12-26
-
SpringBoot实战之文件上传存入AzureStorage
时间:2020-12-29
-
不用找了,比较全的signalR例子已经为你准
时间:2020-12-29
-
.NET Core3.1编写混合C++程序
时间:2020-12-26
