J'essaie d'utiliser l'objet DefaultHttpContext
pour tester mon intergiciel de gestion des exceptions.Inspecter le corps DefaultHttpContext en situation de test unitaire
Ma méthode de test ressemble à ceci:
[Fact]
public async Task Invoke_ProductionNonSuredException_ReturnsProductionRequestError()
{
var logger = new Mock<ILogger<ExceptionHandlerMiddleware>>();
var middleWare = new ExceptionHandlerMiddleware(next: async (innerHttpContext) =>
{
await Task.Run(() =>
{
throw new Exception();
});
}, logger: logger.Object);
var mockEnv = new Mock<IHostingEnvironment>();
mockEnv.Setup(u => u.EnvironmentName).Returns("Production");
var context = new DefaultHttpContext();
await middleWare.Invoke(context, mockEnv.Object);
var reader = new StreamReader(context.Response.Body);
var streamText = reader.ReadToEnd();
//TODO: write assert that checks streamtext is the expected production return type and not the verbose development environment version.
}
Dans mon middleware, je vous écris au contexte comme celui-ci:
public static Task WriteResponse(HttpContext context, HttpStatusCode statusCode, object responseData, Formatting jsonFormatting)
{
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)statusCode;
return context.Response.WriteAsync(JsonConvert.SerializeObject(responseData, jsonFormatting));
}
Pour vous donner une meilleure idée de l'approche middleware j'ai pris, je prends l'approche trouvée dans this answer here. Fonctionne correctement lorsque l'application est en cours d'exécution son pipeline normal. Cependant, en utilisant la méthode DefaultHttpContext dans le test, le corps de réponse revient toujours vide et ContentLength est null. Ainsi, ma variable streamText
dans le test est une chaîne vide.
Est-il possible d'inspecter ce que le middleware écrit dans ce contexte? Est-ce le bon moyen, ou existe-t-il un meilleur moyen?
Que se passe-t-il dans votre middleWare.Invoke()? Peut-être que vous n'appelez pas WriteResponse() ici. – Kostya