web-dev-qa-db-fra.com

Erreur lors de l'exécution du test, si vous utilisez la méthode d'extension CreateResponse pour renvoyer la fonction Azure HttpResponseMessage

Mon code de fonction Azure est comme ci-dessous

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

Dans mon projet de test, je lis le résultat comme ci-dessous:

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

Après avoir exécuté la fonction, lorsqu'elle essaie de renvoyer la réponse dans la variable de résultat, la méthode de test échoue avec exception.

**

System.InvalidOperationException: la demande n'a pas d'objet de configuration associé ou la configuration fournie était nulle.

**

Je me suis assuré que le projet de test a le même System.Net.Http.HttpRequestMessageExtension dll.

Si je modifie le code de la fonction pour ne pas utiliser la méthode d'extension CreateResponse (cette méthode d'extension provient du code du modèle VS 2017) et renvoie la réponse comme ci-dessous, j'obtiens la réponse dans la méthode de test et le scénario de test fonctionne correctement.

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

Vous trouverez ci-dessous la trace de l'erreur

Result StackTrace: at System.Net.Http.HttpRequestMessageExtensions.CreateResponse [T] (HttpRequestMessage request, HttpStatusCode statusCode, T value, HttpConfiguration configuration) at System.Net.Http.HttpRequestMessageExtesCompactResource valeur) à MyFunctionApp.MyHttpTriggerFunction.d__1.MoveNext () --- Fin de la trace de pile de l'emplacement précédent où l'exception a été levée --- à System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (tâche) à System.Runtime.CompilerServices. TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tâche) sur System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult () sur MyFunctionAppUnitTest.MyHttpTriggerFunctionTest\\ ApplicationW\ApplicationW\.cs: ​​ligne 53 --- Fin de la trace de la pile à partir de l'emplacement précédent où l'exception a été levée --- sur System.Runtime.CompilerSe rvices.TaskAwaiter.ThrowForNonSuccess (tâche) à System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (tâche) à Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.ThreadOf MyHttpTriggerFunction_SuccessResult a levé l'exception: System.InvalidOperationException: la demande n'a pas d'objet de configuration associé ou la configuration fournie était nulle.

Suis-je en train de manquer quelque chose de trivial

26
Ramkumar Singh

Le message d'erreur vous indique le problème.

La demande n'a pas d'objet configuration associé ou la configuration fournie était nulle.

Lorsque vous testez la demande en dehors d'un httpserver, vous devez donner à la demande un 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

Ce n'est pas spécifique aux fonctions Azure, mais afin d'exécuter ce test en dehors du contexte d'une requête HTTP réelle, vous devez vous assurer de créer une instance HttpConfiguartion, la configurer comme requis (par exemple, ajouter des formateurs que vous peut avoir besoin) et appelez SetConfiguration sur l'instance HttpRequestMessage avec cet objet.

Exemple:

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