单元测试 – 使用HttpRequestMessage对Azure功能进行单元测试
尝试在Visual Studio中单元测试HTTP触发器Azure函数时,我遇到了一些问题.我创建了一个
GitHub repo(
https://github.com/ericdboyd/TestingAzureFunctions),其中包含一个示例解决方案,其中包含Azure Function项目和演示问题的Unit Test项目.
首先,当我引入Microsoft.AspNet.WebApi.Core时,它会在尝试使用IContentNegotiator时在System.Web.Http和Microsoft.AspNetCore.Mvc.WebApiCompatShim之间产生冲突.唯一的方法是使用以下内容在测试项目的csproj文件中为WebApiCompatShim添加别名: <Target Name="ChangeAliasesOfStrongNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences"> <ItemGroup> <ReferencePath Condition="'%(FileName)' == 'Microsoft.AspNetCore.Mvc.WebApiCompatShim'"> <Aliases>webapicompatshim</Aliases> </ReferencePath> </ItemGroup> 一旦我克服了这个错误,我就会遇到这个问题,而这个问题一直无法解决.使用HttpRequestMessage.CreateResponse扩展方法在Azure函数中返回响应,我得到“没有服务类型’System.Net.Http.Formatting.IContentNegotiator’已经注册.”当我尝试测试它.我已经尝试构建一个HttpRequestMessage,我认为应该使用以下代码使用该扩展方法,该代码也可以在GitHub仓库中找到,但它失败了,而且我已经努力尝试过几个小时了. IServiceCollection services = new ServiceCollection(); services.AddOptions(); services.AddSingleton(typeof(IContentNegotiator),typeof(DefaultContentNegotiator)); IServiceProvider serviceProvider = services.BuildServiceProvider(); var httpContext = new DefaultHttpContext {RequestServices = serviceProvider}; var httpConfiguration = new HttpConfiguration(); HttpRequestMessage request = new HttpRequestMessage { Method = HttpMethod.Post,RequestUri = new Uri(url),Content = new StringContent(content,Encoding.UTF8,"application/json"),Properties = { { HttpPropertyKeys.HttpConfigurationKey,httpConfiguration },{ nameof(HttpContext),httpContext} } }; 如果我不使用CreateResponse扩展方法,只需创建HttpResponseMessage对象,它就可以正常工作. 只是为了设置一些额外的上下文,我知道这不是对Azure函数执行的代码进行单元测试的最佳方法.我对这些代码进行了更细致的单元测试.但我希望能够对执行http请求和对该逻辑的响应之间的映射的Azure功能进行单元测试. GitHub仓库中有两个Azure功能和两个单元测试,一个使用扩展方法,一个没有证明问题.但其他一切都是一样的. 解决方法
不能直接回答你的问题,但它可以帮助你前进.
您正在使用Azure Functions v2 – .NET Standard版本.这个版本目前处于测试阶段,因此它有点阴暗:缺少文档并且存在一些问题. 在V2中,建议使用HttpRequest类和IActionResult而不是’classic’HttpRequestMessage和HttpResponseMessage.默认模板具有如下签名: public static IActionResult Run( [HttpTrigger(AuthorizationLevel.Function,"get")] HttpRequest req,TraceWriter log) 这应该使您能够摆脱您的垫片并单元测试类似于ASP.NET Core方式的功能. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – ASP MVC – 扭转一个foreach
- 10.1.翻译系列:EF 6中的实体映射【EF 6 Code-First系列】
- 用asp解析svg xml
- asp.net – 如何在工作日的特定时间回收应用程序池?
- asp.net-mvc – 如何从模型状态获取错误消息
- asp.net – 我仍然犹豫使用ViewModels而不是View for Model
- asp.net核心 – 在ASP.NET核心应用程序中使用NLog
- 自KB4338419以来,无法再从Classic ASP创建C#COM对象
- asp.net-mvc – 在asp.net mvc中设置为Session的持久cookie
- asp.net-mvc – 测试控制器使用User.Identity.Name的操作