繁体   English   中英

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

[英]Can I access the full power of Autofac in UnitTests, using the Moq integration

我的项目(发生在Orchard之上,尽管我认为这并不重要)使用Autofac 我正在编写单元测试,我想使用Moq消除所有依赖关系,并且正在使用Autofac / Moq集成来实现这一点。

这对于作为构造函数参数传递的任何简单依赖项都很好。 (Autofac文档在此处提供了有关如何实现此目的的详细信息)。

但是因为我从来没有containerBuilder,所以我看不到如何使用许多Autofac的power lamda注册注册泛型 ,将属性标记为自动连接 等等

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

您已经提到,某些功能可以与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>()
    );
}

如您所见,我们必须处理所有通常由扩展方法隐藏的autofac内部代码。 属性Autowired功能可以很容易地与AutoMock一起使用,但是lamda注册将不再有意义。 lambda注册给我们的是,在ContainerBuilder中注册的对象可以依赖于其他注册的对象,这些对象将在将ContainerBuilder构建为IContainer的过程中解决,因此我们不需要关心注册指令的顺序。 在这里,我们已经准备好制作IContainer,并且不会再次构建它,因此这种注册延迟毫无意义。 如果我们想将另一个已经注册的对象传递给某个注册对象,则可以先简单地解决它,然后再使用它。

因此,作为总结:

  • 通常可以通过AutoMock访问autofac功能
  • 由于无法在ContainerBuilder中而不是在IContainer对象中注册,因此某些功能不可用。 其他内容可能尚未实现,可能会在将来交付。
  • 对于几乎所有情况,都有很好的解决方法,如上面的示例所示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM