如何解决如何测试是否在ASP.NET Core中调用UseDeveloperExceptionPage中间件?
我的情况确实很棘手。我需要测试抛出异常时是否正在调用UseDeveloperExceptionPage中间件。 为了实现这一目标,我编写了一些辅助代码。
DiagnosticExceptionAssembly.cs
namespace TestProjectSample
{
internal static class DiagnosticExceptionAssembly
{
internal const string Assembly = "Microsoft.AspNetCore.Diagnostics.UnhandledException";
}
}
ExceptionMessage.cs
namespace TestProjectSample
{
public struct ExceptionMessage
{
public string Message { get; set; }
}
}
ExceptionMessageObserver.cs
using System;
namespace TestProjectSample
{
public class ExceptionMessageObserver : IExceptionMessage
{
public string Message { get; set; }
public void OnCompleted()
{
throw new NotImplementedException();
}
public void OnError(Exception error)
{
throw new NotImplementedException();
}
public void OnNext(ExceptionMessage value)
{
Message = value.Message;
}
}
public interface IExceptionMessage : IObserver<ExceptionMessage>
{
string Message { get; set; }
}
}
ExceptionObserver.cs
using System;
using System.Collections.Generic;
using System.Reflection;
namespace TestProjectSample
{
public class ExceptionObserver : IObserver<KeyValuePair<string,object>>
{
private readonly IObserver<ExceptionMessage> _exceptionMessage;
public ExceptionObserver(IObserver<ExceptionMessage> exceptionMessage)
{
_exceptionMessage = exceptionMessage;
}
public void OnCompleted()
{
throw new NotImplementedException();
}
public void OnError(Exception error)
{
throw new NotImplementedException();
}
public void OnNext(KeyValuePair<string,object> value)
{
switch (value.Key)
{
case DiagnosticExceptionAssembly.Assembly:
var exceptionPayload = value.Value
.GetType()
.GetTypeInfo()
.GetDeclaredProperty("Exception")?
.GetValue(value.Value) as string;
_exceptionMessage.OnNext(new ExceptionMessage {Message = exceptionPayload});
break;
}
}
}
}
ExceptionSubscriber.cs
using System;
using System.Diagnostics;
namespace TestProjectSample
{
public class ExceptionSubscriber : IObserver<DiagnosticListener>
{
private readonly IObserver<ExceptionMessage> _exceptionMessage;
public ExceptionSubscriber(IObserver<ExceptionMessage> exceptionMessage)
{
_exceptionMessage = exceptionMessage;
}
public void OnCompleted()
{
throw new NotImplementedException();
}
public void OnError(Exception error)
{
throw new NotImplementedException();
}
public void OnNext(DiagnosticListener value)
{
if (string.Equals(DiagnosticExceptionAssembly.Assembly,value.Name))
{
value.Subscribe(new ExceptionObserver(_exceptionMessage));
}
}
}
}
DevExceptionPageFacts.cs
using System.Diagnostics;
using System.Net;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.Hosting;
using Xunit;
namespace TestProjectSample
{
public class DevExceptionPageFacts
{
private readonly IHostBuilder _hostBuilder;
private static readonly IExceptionMessage ExceptionMessage = new ExceptionMessageObserver();
public DevExceptionPageFacts()
{
FactSubscriber();
_hostBuilder = GenerateExceptionHostBuilder();
}
private static IHostBuilder GenerateExceptionHostBuilder()
{
return new HostBuilder()
.ConfigureWebHost(builder =>
{
builder.UseTestServer();
builder.Configure(applicationBuilder =>
{
applicationBuilder.UseDeveloperExceptionPage();
applicationBuilder.Run(context => throw new HttpResetTestException(1));
});
});
}
private static void FactSubscriber()
{
DiagnosticListener.AllListeners.Subscribe(new ExceptionSubscriber(ExceptionMessage));
}
[Fact]
public async Task Throw_DevelopmentPageException()
{
var host = await _hostBuilder.StartAsync();
using var client = host.GetTestClient();
var response = await client.GetAsync("/");
Assert.Equal(HttpStatusCode.InternalServerError,response.StatusCode);
Assert.NotNull(ExceptionMessage.Message);
}
}
}
研究UseDeveloperExceptionPage的源代码我已经注意到DiagnosticSource的注入,因此我决定创建一个类来侦听中间件引发和捕获异常时的情况。但是我的测试没有通过。有人知道如何通过此测试吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。