我们偶尔会遇到问题,有人将一些 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/