c# - 如何测试所有 ASP.NET Core Controllers 的依赖注入(inject)是否有效?

标签 c# asp.net-core dependency-injection automated-tests

我们偶尔会遇到问题,有人将一些 DI 添加到 Controller 中,但忘记将相关行添加到 Startup.cs 中以设置对象的范围。

这不会阻止应用程序启动,而是在命中相关端点时抛出异常。

有没有办法以编程方式检查所有 Controller 是否有效并阻止应用程序以其他方式启动?

或者是否有一种简单的方法来编写一个包罗万象的自动化测试来检查每个 Controller 是否可以使用 Startup.cs 中的指定 DI 进行实例化?

最佳答案

你可以这样写:

[TestFixture]
[Category(TestCategory.Integration)]
public class ControllersResolutionTest
{
    [Test]
    public void VerifyControllers()
    {
        var builder = new WebHostBuilder()
            .UseStartup<IntegrationTestsStartup>();
        var testServer = new TestServer(builder);
        var controllersAssembly = typeof(UsersController).Assembly;
        var controllers = controllersAssembly.ExportedTypes.Where(x => typeof(ControllerBase).IsAssignableFrom(x));
        var activator = testServer.Host.Services.GetService<IControllerActivator>();
        var serviceProvider = testServer.Host.Services.GetService<IServiceProvider>();
        var errors = new Dictionary<Type, Exception>();
        foreach (var controllerType in controllers)
        {
            try
            {
                var actionContext = new ActionContext(
                    new DefaultHttpContext
                    {
                        RequestServices = serviceProvider
                    },
                    new RouteData(),
                    new ControllerActionDescriptor
                    {
                        ControllerTypeInfo = controllerType.GetTypeInfo()
                    });
                activator.Create(new ControllerContext(actionContext));
            }
            catch (Exception e)
            {
                errors.Add(controllerType, e);
            }
        }

        if (errors.Any())
        {
            Assert.Fail(
                string.Join(
                    Environment.NewLine,
                    errors.Select(x => $"Failed to resolve controller {x.Key.Name} due to {x.Value.ToString()}")));
        }
    }
}

此代码实际上经历了使用数据库配置设置 asp.net 核心应用程序的完整过程,以及您在启动时没有的内容,因此您可能希望从中派生并删除/模拟一些内容。此代码还需要 Microsoft.AspNetCore.TestHost核聚变。


我更改了我提出的原始代码,因为它没有按预期工作。

关于c# - 如何测试所有 ASP.NET Core Controllers 的依赖注入(inject)是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50795704/

相关文章:

c# - 在没有 OverflowException 的情况下将 "1.79769313486232E+308"转换为 double?

javascript - 如何在 Javascript 中使用(分配和操作)Razor 变量

asp.net - Microsoft 依赖注入(inject)和 HttpClientFactory w/.NET Framework 4.6+/MVC 5.2/Web API 2

c# - .Net Core HttpClient - 类型化客户端生命周期

Angular 2 提供程序不使用 useValue 和对 new 的函数调用

c# - 在 c# 中的网络浏览器中删除 word 文档中的警报

c# - 如何在 PowerShell 上获取 JSON 输出中的特定值?

c# - 每个请求的 AntiForgeryToken 更改

c# - 不在 .NET Core 中处理流

vue.js - OIDC 客户端支持 Multi-Tenancy - oidc-client 抛出 "no matching state found in storage"