web-dev-qa-db-ja.com

CreateResponse拡張メソッドを使用してAzure Function HttpResponseMessageを返す場合、テストの実行中にエラーが発生しました

私の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:要求に関連付けられた構成オブジェクトがないか、指定された構成がnullでした。

**

テストプロジェクトに同じ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 request、HttpStatusCode statusCode、T value、HttpConfiguration configuration)at System.Net.Http.HttpRequestMessageExtensions.CreateResponse [T](HttpRequestMessage request、HttpStatusCode statusCode、T value)at MyFunctionApp.MyHttpTriggerFunction.d__1.MoveNext()---例外がスローされた前の場所からのスタックトレースの終わり--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)at System.Runtime.CompilerServices。 TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()at MyFunctionAppUnitTest.MyHttpTriggerFunctionTest.d__2.MoveNext()in C:\ Users\rsingUnit\Desktop\FunctionRiveUnitMyMyAPI_Test_MyMyAPI_Test_MyMyTestService_Git_Workspace_Git_Workspace .cs:line 53 ---例外がスローされた前の場所からのスタックトレースの終わり--- at System.Runtime.CompilerSe System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)でのMicrosoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.ThreadOperations.ExecuteWithAbortSafety(Action action)MyTrigAppUnitTestTestTest関数のテストメッセージテスト関数のテストメッセージ:テストメッセージテスト関数のテスト:テストメッセージのテスト結果のテストMyHttpTriggerFunction_SuccessResultが例外をスローしました:System.InvalidOperationException:リクエストに関連付けられた構成オブジェクトがないか、提供された構成がnullでした。

些細なことを逃していますか

26
Ramkumar Singh

エラーメッセージが問題を通知しています。

リクエストに関連付けられたconfigurationオブジェクトがないか、提供された設定がnullでした。

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
42
Nkosi

これはAzure Functionsに固有のものではありませんが、実際のHTTPリクエストのコンテキスト外でこのテストを実行するには、HttpConfiguartionインスタンスを作成し、必要に応じて構成する必要があります(例:フォーマッターを追加します)必要な場合があります)、そのオブジェクトを使用してSetConfigurationインスタンスでHttpRequestMessageを呼び出します。

例:

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