DefaultHttpContext
オブジェクトを使用して、私の例外処理ミドルウェアをユニットテストしようとしています。ユニットテスト状況でDefaultHttpContextボディを検査する
私の試験方法は次のようになります。私のミドルウェアで
[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.
}
、私はこのようなコンテキストに書いている:あなたのミドルウェア・アプローチへのより多くの洞察力を与えるために
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));
}
私はしました私はthis answer hereにあるアプローチを取っています。
アプリケーションが通常のパイプラインを実行しているときにうまく動作します。ただし、テストでDefaultHttpContextメソッドを使用すると、応答本体は常に空に戻り、ContentLengthはnullになります。したがって、私のstreamText
変数は空文字列です。
この状況で、ミドルウェアがコンテキストに書き込んでいる内容を調べることは可能ですか?これは適切な方法ですか、より良い方法がありますか?あなたは、ストリームの制御を持っているように、
あなたのミドルウェアではどうなりますか? WriteResponse()を呼び出さないでください。 – Kostya