执行测试时出错,如果使用CreateResponse扩展方法返回Azure Function HttpResonseMessage

我的Azurefunction代码如下所示

public static class MyHttpTriggerFunction { public static async Task Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log) { // some business logic if (valid) { return req.CreateResponse(HttpStatusCode.OK, true); } else { return req.CreateResponse(HttpStatusCode.BadRequest, "some error message"); } } } 

在我的测试项目中,我正在阅读如下结果:

 var result = await MyHttpTriggerFunction.Run(req, log).ConfigureAwait(false); 

执行该函数后,当它尝试在结果变量中返回响应时,测试方法失败并出现exception。

**

System.InvalidOperationException:请求没有关联的配置对象,或者提供的配置为null。

**

我确保测试项目具有相同的System.Net.Http.HttpRequestMessageExtension dll。

如果我更改function代码不使用CreateResponse扩展方法(此扩展方法来自VS 2017模板的代码)并返回如下所示的响应,我在测试方法中得到响应,测试用例运行正常。

 var res = new HttpResponseMessage(); if (valid) { res.StatusCode = HttpStatusCode.OK; res.Content = new ObjectContent(true, new JsonMediaTypeFormatter()); return res; } else { res.StatusCode = HttpStatusCode.BadRequest; res.Content = new ObjectContent("some error message", new JsonMediaTypeFormatter()); return res; } 

下面是错误的堆栈跟踪

结果StackTrace:System.Net.Http.HttpRequestMessageExtensions.CreateResponse [T](HttpRequestMessage请求,HttpStatusCode statusCode,T值,HttpConfiguration配置)在System.Net.Http.HttpRequestMessageExtensions.CreateResponse [T](HttpRequestMessage请求,HttpStatusCode statusCode,T)在MyFunctionApp.MyHttpTriggerFunction.d__1.MoveNext()—从抛出exception的先前位置的堆栈跟踪结束—在System.Runtime.CompilerServices上的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处。位于C:\ Users \ rsingh \ Desktop \ Git_Workspace \ ActivationAPI \ MyFunctionAppUnitTest \ MyHttpTriggerFunctionTest中的MyFunctionAppUnitTest.MyHttpTriggerFunctionTest.d__2.MoveNext()中的System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()中的TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) .cs:第53行—从抛出exception的上一个位置的堆栈跟踪结束—在System.Runtime.CompilerSe Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.ThreadOperations.ExecuteWithAbortSafety(Action action)中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的rvices.TaskAwaiter.ThrowForNonSuccess(任务任务)结果消息:测试方法MyFunctionAppUnitTest.MyHttpTriggerFunctionTest。 MyHttpTriggerFunction_SuccessResult引发exception:System.InvalidOperationException:请求没有关联的配置对象,或者提供的配置为null。

我错过了一些微不足道的东西

错误消息告诉您问题。

请求没有关联的配置对象,或者提供的配置为null。

在测试HttpConfiguration.的请求时,您需要为请求提供HttpConfiguration.

 // Arrange. var configuration = new HttpConfiguration(); var request = new System.Net.Http.HttpRequestMessage(); request.Properties[System.Web.Http.Hosting.HttpPropertyKeys.HttpConfigurationKey] = configuration; //...other code 

这不是特定于Azurefunction,但为了在实际HTTP请求的上下文之外执行此测试,您需要确保创建HttpConfiguartion实例,根据需要配置它(例如添加您可能需要的任何格式化程序)并调用使用该对象的HttpRequestMessage实例上的SetConfiguration

例:

 var configuration = new HttpConfiguration(); var request = new HttpRequestMessage(); request.SetConfiguration(configuration);