当前位置: 首页 > 编程语言 > C#

在ASP.NET Core MVC API控制器上对AuthorizeAttribute进行unit testing分享

时间:2023-04-10 20:02:51 C#

C#学习教程:在ASP.NETCoreMVCAPI控制器上进行单元测试AuthorizeAttribute控制器:使用Microsoft.AspNetCore.Authorization;使用Microsoft.AspNetCore.Mvc;使用System.Threading.Tasks;命名空间TransitApi.Api.Controllers{[Route("api/foo")]publicclassFooController:Controller{privateIFooRepositoryFooRepository{get;}publicFooController(IFooRepositoryfooRepository){FooRepository=fooRepository;}[HttpGet][Authorize("scopes:getfoos")]publicasyncTaskGetAsync(){varfoos=awaitFooRepository.GetAsync();返回Json(foos);我必须能够对AuthorizeAttribute的有效性进行单元测试。我们的代码库中存在缺少属性和不正确范围的问题。这个答案正是我要找的,但是Microsoft.AspNetCore.Mvc.Controller中没有ActionInvoker方法,这意味着我做不到。单元测试:[事实]publicvoidGetAsync_InvalidScope_ReturnsUnauthorizedResult(){//安排varfooRepository=newStubFooRepository();varcontroller=newFooController(fooRepository){ControllerContext=newControllerContext{HttpContext=newFakeHttpContext()//HttpContext//,User=newUser(){Scopes="none"}}};//Actvarresult=controller.GetAsync().Result;//断言Assert.IsType(result);}如何更正无范围用户是否正在运行单元测试拒绝访问我的控制器方法?目前我决定只测试AuthorizeAttribute的存在,就像这样,但这还不够好:varcontroller=newFooController(fooRepository){ControllerContext=newControllerContext{HttpContext=newFakeHttpContext()}};//动作vartype=controller.获取类型();var方法信息=类型。GetMethod("GetAsync",newType[]{});var属性=方法信息。GetCustomAttributes(类型f(AuthorizeAttribute),真);//断言Assert.True(attributes.Any());这是使用内存测试服务器进行集成测试所必需的,因为该属性由ASP.NET框架在处理请求管道时进行评估核心集成测试中的集成测试可确保应用程序组件在组装在一起时正常运行。ASP.NETCore支持使用单元测试框架和内置测试Web主机进行集成测试,可用于在没有网络开销的情况下处理请求。[事实]publicasyncTaskGetAsync_InvalidScope_ReturnsUnauthorizedResult(){//安排varserver=newTestServer(newWebHostBuilder().UseStartup());varclient=server.CreateClient();varurl="api/foo";varexpected=HttpStatusCode.Unauthorized;//Actvarresponse=awaitclient.GetAsync(url);//断言Assert.AreEqual(expected,response.StatusCode);如果您不希望您的测试命中实际的生产实现,您还可以专门创建一个启动程序来替换存根/模拟DI的任何依赖项。以上就是《C#学习教程:ASP.NETCoreMVCAPI控制器上的单元测试AuthorizeAttribute》的全部内容。收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: