确认正在使用中间件

时间:2018-05-01 12:56:24

标签: c# unit-testing asp.net-core moq asp.net-core-middleware

我试图通过单元测试确认中间件实际上正被添加到管道中。我有以下静态方法添加中间件。这就是我正在测试的。

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中间件的存在的相关资料。

非常感谢任何帮助!

3 个答案:

答案 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>();

当列表中只有一个中间件时,此方法有效。