我试图通过单元测试确认中间件实际上正被添加到管道中。我有以下静态方法添加中间件。这就是我正在测试的。
public static class HandleDbUpdateExceptionExtensions
{
public static IApplicationBuilder UseDbUpdateExceptionHandler(this IApplicationBuilder builder)
{
return builder.UseMiddleware<DbUpdateExceptionHandler>();
}
}
我知道它确实有效,因为中间件在我的网站上运行。但是,我想编写一个单元测试,以确保它始终包含在未来的版本中。但是,我的单元测试失败了:
[Fact(DisplayName = "Exception handler is added to IApplicationBuilder")]
public void DbUpdateExceptionHandler_Added_To_IApplicationBuilder()
{
var builder = new Mock<IApplicationBuilder>().Object;
builder.UseDbUpdateExceptionHandler();
Assert.NotNull(builder.ApplicationServices);
//var test = builder.ApplicationServices.GetService(typeof(DbUpdateExceptionHandler));
}
builder.ApplicationServices
为null,因此测试当前失败。我认为它失败了,因为我只是在嘲笑IApplicationBuilder
,但是在网上很少有关于单元测试.Net Core中间件的存在的相关资料。
非常感谢任何帮助!
答案 0 :(得分:4)
UseMiddleware
实际上是一种扩展方法,它将创建一个在内部使用中间件的RequestDelegate。该委托做了很多事情,所以你很难测试它是否会正确注册你的实际中间件类型。
您唯一能做的就是检查是否使用某些请求委托来调用基础ApplicationBuilder.Use
method。
或者,您也可以通过构建应用程序管道并执行它来实际调用中间件。但这需要您正确设置依赖注入(因为来自UseMiddleware()
的委托将使用它)并且所有中间件的依赖项都已正确设置。
所以这将非常复杂。我建议你写一个integration test代替检查请求,你的中间件将被正确调用,并可以做它应该做的事情。
答案 1 :(得分:1)
除了@ poke的答案,您可能还想查看middleware analysis,它是ASP.NET核心诊断堆栈的一部分。还有一个sample application可用。
它的基本功能是围绕每个中间件,AnalysisMiddleware
将信息写入诊断源。您可以在测试中创建诊断源侦听器,并验证是否调用了每个中间件。但是,这需要您执行中间件管道,这有效地意味着您创建集成测试。
答案 2 :(得分:1)
这是我做的方法:
var serviceCollection = new ServiceCollection();
serviceCollection.AddSingleton(Mock.Of<ILogger<ExceptionHandlingMiddleware>>());
var applicationBuilder = new ApplicationBuilder(serviceCollection.BuildServiceProvider());
applicationBuilder.UseExceptionHandlingMiddleware();
var app = applicationBuilder.Build();
app.Target.Should().BeOfType<ExceptionHandlingMiddleware>();
当列表中只有一个中间件时,此方法有效。