Unit testing 使用HttpRequestMessage对Azure函数进行单元测试

Unit testing 使用HttpRequestMessage对Azure函数进行单元测试,unit-testing,azure,azure-functions,asp.net-core-webapi,Unit Testing,Azure,Azure Functions,Asp.net Core Webapi,在VisualStudio中尝试对HTTP触发器Azure函数进行单元测试时,我遇到了一些问题。我创建了一个GitHub repo(),其中包含一个示例解决方案,该解决方案包含一个Azure函数项目和一个演示问题的单元测试项目 首先,当我引入Microsoft.AspNet.WebApi.Core时,在尝试使用IContentNegotiator时,它会在System.Web.Http和Microsoft.AspNetCore.Mvc.WebApiCompatShim之间产生冲突。唯一的解决方法

在VisualStudio中尝试对HTTP触发器Azure函数进行单元测试时,我遇到了一些问题。我创建了一个GitHub repo(),其中包含一个示例解决方案,该解决方案包含一个Azure函数项目和一个演示问题的单元测试项目

首先,当我引入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>
如果我不使用CreateResponse扩展方法,只创建HttpResponseMessage对象,它就可以正常工作

只是为了设置一些额外的上下文,我知道这不是对Azure函数正在执行的代码进行单元测试的最佳方式。我正在更精确地对代码进行单元测试。但是我希望能够对Azure函数进行单元测试,该函数正在执行http请求和对该逻辑的响应之间的映射


GitHub repo中有两个Azure函数和两个单元测试,一个使用扩展方法,一个不使用扩展方法来演示问题。但其他一切都是一样的。

不是对你的问题的直接回答,但它会帮助你前进

您正在使用Azure Functions v2-.NET标准版本。这个版本目前处于测试阶段,所以有点阴暗:文档缺失,存在一些问题

在V2中,建议您使用
HttpRequest
类和
IActionResult
而不是“经典”的
HttpRequestMessage
HttpResponseMessage
。默认模板具有如下签名:

publicstaticiactionresult运行(
[HttpTrigger(AuthorizationLevel.Function,“get”)]HttpRequest请求,TraceWriter日志)

这将使您能够摆脱垫片,并以类似ASP.NET Core的方式对函数进行单元测试。

在响应时指定jsonformatter,如下所示

req.CreateResponse(HttpStatusCode.OK,$“你好,{name}”,新的JsonMediaTypeFormatter())

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} 
    }
};