【问题标题】:Error while executing test, if using CreateResponse extention method to return Azure Function HttpResonseMessage执行测试时出错,如果使用 CreateResponse 扩展方法返回 Azure Function HttpResponseMessage
【发布时间】:2017-11-10 20:21:31
【问题描述】:

我的 Azure Function 代码如下所示

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

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

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

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

**

System.InvalidOperationException:请求没有 关联的配置对象或提供的配置是 空。

**

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

如果我更改功能代码不使用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;
}

下面是错误的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.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult() 在 MyFunctionAppUnitTest.MyHttpTriggerFunctionTest.d__2.MoveNext() 在 C:\Users\rsingh\Desktop\Git_Workspace\ActivationAPI\MyFunctionAppUnitTest\MyHttpTriggerFunctionTest.cs:line 53 --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.ThreadOperations.ExecuteWithAbortSafety(操作 操作)结果消息:测试方法 MyFunctionAppUnitTest.MyHttpTriggerFunctionTest.MyHttpTriggerFunction_SuccessResult 抛出异常:System.InvalidOperationException:请求确实 没有关联的配置对象或提供的 配置为空。

我错过了什么琐碎的事情

【问题讨论】:

    标签: c# unit-testing azure visual-studio-2017 azure-functions


    【解决方案1】:

    错误消息告诉您问题所在。

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

    在 httpserver 之外测试请求时,您需要为请求提供 HttpConfiguration.

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

    【讨论】:

    • 遗憾的是错误消息没有告诉我们解决方案,或者配置对象确实应该在那个神秘的属性包中。
    • 我在本地主机中使用邮递员时收到此错误。有没有办法在那里添加配置?
    【解决方案2】:

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

    例子:

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

    【讨论】:

    • 以上对我有用。 1. 确保包含 System.Web.Http。 2. 使它与给定的代码示例一起工作的适配,在调用 CreateResponse 方法之前,您应该将其设置为: var configuration = new HttpConfiguration(); req.SetConfiguration(配置);
    猜你喜欢
    • 2012-06-18
    • 1970-01-01
    • 2012-09-06
    • 2011-07-27
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多