[英]Can I access the full power of Autofac in UnitTests, using the Moq integration
我的项目(发生在Orchard之上,尽管我认为这并不重要)使用Autofac 。 我正在编写单元测试,我想使用Moq消除所有依赖关系,并且正在使用Autofac / Moq集成来实现这一点。
这对于作为构造函数参数传递的任何简单依赖项都很好。 (Autofac文档在此处提供了有关如何实现此目的的详细信息)。
但是因为我从来没有containerBuilder,所以我看不到如何使用许多Autofac的power lamda注册 , 注册泛型 ,将属性标记为自动连接 。 等等
您已经提到,某些功能可以与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,并且不会再次构建它,因此这种注册延迟毫无意义。 如果我们想将另一个已经注册的对象传递给某个注册对象,则可以先简单地解决它,然后再使用它。
因此,作为总结:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.