Rei*_*l-- 6 c# unit-testing moq mocking autofac
我的项目(这恰好建在上面果园,虽然我不认为这是相关的)使用Autofac.我正在编写单元测试,我希望使用Moq来删除任何依赖项,并且我正在使用Autofac/Moq集成来实现这一点.
这适用于作为构造函数参数传递的任何简单依赖项.(Autofac文档提供了如何实现这一细节在这里).
但是因为我没有容器,所以我看不到如何使用很多Autofac的功能 - 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>()
);
}
Run Code Online (Sandbox Code Playgroud)
正如您现在所看到的,我们必须处理 autofac 内部代码的所有丑陋之处,这些代码通常被扩展方法隐藏。PropertiesAutowired 功能可以很容易地与 AutoMock 一起使用,但是 lamda 注册将不再有多大意义。lambda 注册给我们带来的是,在 ContainerBuilder 中注册的对象可以依赖于其他注册对象,这些对象将在将 ContainerBuilder 构建为 IContainer 期间解析,因此我们不需要关心注册指令的顺序。这里我们已经准备好了 IContainer,并且不会再次构建它,因此这种延迟注册是没有意义的。如果我们想将另一个已注册的对象传递给某个已注册的对象,那么我们可以简单地先解析它,然后使用它。
总结如下:
归档时间: |
|
查看次数: |
2837 次 |
最近记录: |