首页 > 解决方案 > 确认中间件正在使用中

问题描述

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

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为空,因此测试当前失败。我认为它失败了,因为我只是在嘲笑,但网上关于单元测试.Net Core 中间件存在IApplicationBuilder的相关材料很少。

任何帮助是极大的赞赏!

标签: c#unit-testingasp.net-coremoqasp.net-core-middleware

解决方案


UseMiddleware实际上是一个扩展方法,它将创建一个在内部使用您的中间件的 RequestDelegate。该委托做了很多事情,因此您很难测试它是否会正确注册您的实际中间件类型。

你唯一能做的就是检查底层ApplicationBuilder.Use方法是否被一些请求委托调用。

或者,您也可以通过构建应用程序管道并执行它来实际调用中间件。但这将要求您正确设置依赖注入(因为委托UseMiddleware()将使用它)并且您的所有中间件的依赖项都已正确设置。

所以这将是非常复杂的。我建议您编写一个集成测试,而不是检查请求,您的中间件将被正确调用并且可以执行它应该执行的操作。


推荐阅读