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

我的项目(建立在Orchard之上,虽然我认为不相关)使用Autofac 。 我正在编写unit testing,我希望使用Moq来删除任何依赖项,并且我正在使用Autofac / Moq集成来实现这一点。

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

但是因为我没有使用containerBuilder,所以我看不到如何使用很多Autofac的function – lamda注册 , 注册generics ,标记要自动连接的属性。 等等

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

您提到过,某些function可以与AutoMock类一起使用,有些function将不再有意义。 使用AutoMock我们不处理ContainerBuilder类 – 这是为了简单起见,我们不希望编写所有那些注册指令,而只是注册那些对我们感兴趣的指令。 因此,通过使用GetLoose或GetStrict方法创建AutoMock对象,我们只处理已构建的IContainer对象,以便解决问题。 幸运的是,IContainer仍允许我们扩展其注册集,但是Autofac不支持使用方便的扩展方法,因为它们是为了使用ContainerBuilder对象而构建的。 这是完全合理的,因为对于Autofac透视图,在IContainer对象上扩展定义是不常见的。 ContainerBuilder应该处理注册,而IContainer应该处理解析。

在这里,作为一个例子,我将介绍如何使用AutoMock我们可以使用自动连线属性function:

using (var mock = AutoMock.GetLoose()) { mock.Container.ComponentRegistry.Register( RegistrationBuilder .ForType() .PropertiesAutowired() .CreateRegistration() ); } 

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

总结如下:

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