如何为Autofac中的InstancePerRequest服务编写单元测试(或回归测试)

3
过去,我曾经处理过包含大量 Autofac 组件的复杂项目。为了检查是否所有必要的(顶层)组件都能被解析,我们会编写一个单元测试来尝试解析它们。
但是现在我正在尝试在 ASP.NET MVC 项目中实现这一点。
我通过以下方式注册了我的 ApiControllers:
builder.RegisterType<MyController>().InstancePerRequest();

我想这样进行测试:

var containerBuilder = new ContainerBuilder();
foreach (var module in ModuleRepository.GetModulesForWebsite())
{
    containerBuilder.RegisterModule(module);
}

var container = containerBuilder.Build();

foreach (var componentRegistryRegistration in container.ComponentRegistry.Registrations)
{
    foreach (var service in componentRegistryRegistration.Services.OfType<TypedService>())
    {
        if (service.ServiceType.IsAssignableTo<ApiController>())
        {
            var implementation = container.Resolve(service.ServiceType);
            implementation.Should().NotBeNull();
        }
    }
}

然而,这会导致以下异常情况:
Autofac.Core.DependencyResolutionException: Unable to resolve 
the type 'Website.APIControllers.Clean.IngredientsController' 
because the lifetime scope it belongs in can't be located. The 
following services are exposed by this registration:
- MyProject.MyController

有人有想法如何优雅地解决这个问题吗?我应该伪造一个HttpRequest吗?如果是,我该在哪里和如何实现?还是有其他选择?


你是否阅读了有关如何测试每个请求依赖项的文档?(http://autofac.readthedocs.io/en/latest/faq/per-request-scope.html#testing-with-per-request-dependencies) - Travis Illig
啊,是的,现在我有了 :) 我选择了 InstancePerLifetimeScope 选项。随意将其添加为答案并获得甜蜜的声望分数。 - Peter
1个回答

2

这里有关于如何测试每个请求依赖项的文档。

根据问题中的评论线程,听起来您已将每个请求的依赖项切换为每个生命周期范围(这也是ASP.NET Core现在处理事情的方式)。

对于未来的问题读者,实际上有几个选项,请查看文档以获取更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接