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

Ram*_*ngh 25 c# unit-testing azure azure-functions visual-studio-2017

我的Azure功能代码如下所示

public static class MyHttpTriggerFunction
{       
    public static async Task<HttpResponseMessage> 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");
        }            
    }
}
Run Code Online (Sandbox Code Playgroud)

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

var result = await MyHttpTriggerFunction.Run(req, log).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

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

**

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

**

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

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

var res = new HttpResponseMessage();
if (valid)
{
    res.StatusCode = HttpStatusCode.OK;
    res.Content = new ObjectContent<bool>(true, new JsonMediaTypeFormatter());        
    return res;
}
else
{
     res.StatusCode = HttpStatusCode.BadRequest;
     res.Content = new ObjectContent<string>("some error message", new JsonMediaTypeFormatter());
     return res;
}
Run Code Online (Sandbox Code Playgroud)

下面是错误的堆栈跟踪

结果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()---从抛出异常的先前位置的堆栈跟踪结束---在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行---从抛出异常的上一个位置的堆栈跟踪结束---在System.Runtime.CompilerSe Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.ThreadOperations.ExecuteWithAbortSafety(Action action)中的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中的rvices.TaskAwaiter.ThrowForNonSuccess(任务任务)结果消息:测试方法MyFunctionAppUnitTest.MyHttpTriggerFunctionTest. MyHttpTriggerFunction_SuccessResult引发异常:System.InvalidOperationException:请求没有关联的配置对象,或者提供的配置为null.

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

Nko*_*osi 41

错误消息告诉您问题.

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

在测试http服务器的请求时,您需要提供请求a HttpConfiguration.

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

//...other code
Run Code Online (Sandbox Code Playgroud)

  • 羞耻的错误信息并没有告诉我们解决方案,或者说配置对象确实是在那个神秘的属性包里面. (7认同)
  • 我在本地主机中使用邮递员时收到此错误。有什么办法可以在那里添加配置吗? (2认同)

Fab*_*nte 15

这是不特定于Azure的功能,但为了实际的HTTP请求的上下文之外执行这个测试,你需要确保你创建一个HttpConfiguartion实例,将其配置为需要(如增加可能需要的任何格式化),并呼吁SetConfigurationHttpRequestMessage具有该对象的实例.

例:

var configuration = new HttpConfiguration();
var request = new HttpRequestMessage();
request.SetConfiguration(configuration);
Run Code Online (Sandbox Code Playgroud)