我可以使用Moq集成在UnitTests中访问Autofac的全部功能吗?

Rei*_*l-- 6 c# unit-testing moq mocking autofac

我的项目(这恰好建在上面果园,虽然我不认为这是相关的)使用Autofac.我正在编写单元测试,我希望使用Moq来删除任何依赖项,并且我正在使用Autofac/Moq集成来实现这一点.

这适用于作为构造函数参数传递的任何简单依赖项.(Autofac文档提供了如何实现这一细节在这里).

但是因为我没有容器,所以我看不到如何使用很多Autofac的功能 - lamda注册,注册泛型,标记要自动连接的属性.等等

  • 我错了,它可以以某种方式访问​​?
  • 由于场景的一些固有约束,这些东西是不可用的吗?
  • 是否有可能,尚未在此Autofac/Moq集成中实现(尚未)?
  • 有好的工作吗?

mr1*_*100 2

您提到的某些功能可以与 AutoMock 类一起使用,而有些则不再有意义。使用 AutoMock,我们不处理 ContainerBuilder 类 - 这是为了简单起见,我们不想编写所有这些注册指令,而只想注册我们感兴趣的指令。因此,从使用 GetLoose 或 GetStrict 方法创建 AutoMock 对象开始,我们仅处理已构建的 IContainer 对象,准备好解决问题。对我们来说幸运的是,IContainer 仍然允许我们扩展其注册集,但是 Autofac 不支持其方便的扩展方法,因为它们是为与 ContainerBuilder 对象一起使用而构建的。这是完全合理的,因为对于 Autofac 透视图来说,扩展 IContainer 对象上的定义是不常见的。ContainerBuilder 应该处理注册,IContainer 应该处理解析。

在这里,我将作为示例介绍如何通过 AutoMock 使用自动连线属性功能:

using (var mock = AutoMock.GetLoose())
{
    mock.Container.ComponentRegistry.Register(
        RegistrationBuilder
            .ForType<MyClass>()
            .PropertiesAutowired()
            .CreateRegistration<MyClass, ConcreteReflectionActivatorData, SingleRegistrationStyle>()
    );
}
Run Code Online (Sandbox Code Playgroud)

正如您现在所看到的,我们必须处理 autofac 内部代码的所有丑陋之处,这些代码通常被扩展方法隐藏。PropertiesAutowired 功能可以很容易地与 AutoMock 一起使用,但是 lamda 注册将不再有多大意义。lambda 注册给我们带来的是,在 ContainerBuilder 中注册的对象可以依赖于其他注册对象,这些对象将在将 ContainerBuilder 构建为 IContainer 期间解析,因此我们不需要关心注册指令的顺序。这里我们已经准备好了 IContainer,并且不会再次构建它,因此这种延迟注册是没有意义的。如果我们想将另一个已注册的对象传递给某个已注册的对象,那么我们可以简单地先解析它,然后使用它。

总结如下:

  • autofac 功能通常可以通过 AutoMock 访问
  • 由于不能在 ContainerBuilder 中注册而是在 IContainer 对象中注册的限制,某些功能不可用。其他的东西可能还没有实现,也许将来会交付。
  • 对于几乎所有情况,都有很好的解决方法,如上例所示