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