当前位置: 首页 > 编程语言 > C#

如何在AutoFixtureShare中设置更复杂(类IoC)注册

时间:2023-04-10 17:08:49 C#

如何在AutoFixture中设置更复杂(类IoC)注册使用AutoFixture时,是否可以在集成中重用生产IoC容器注册测试?问题是我需要以下夹具设置来注入模拟并注入“真实”数据库相关依赖项如果依赖项未注册varfixture=newFixture().WithMocks().WithRealDatabase()解决方案我已经尝试过内部静态FixtureWithMocks(这个Fixturefixture){fixture.Customize(newAutoMoqCustomization());}internalstaticFixtureWithRealDatabase(thisFixturefixture){varcontainerBuilder=newAutofac.ContainerBuilder();...containerBuilder.Register(c=>c.Resolve().OpenSession())containerBuilder.RegisterGeneric(typeof(Repository)).AsImplementedInterfaces()containerBuilder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies()).Where(t=>t.Name.EndsWith("Repository")).AsImplementedInterfaces();...fixture.Customizations.Add(newContainerSpecimenBuilder(containerBuilder.Build()));}内部类ContainerSpecimenBuilder:ISpecimenBuilder{privatereadonlyIContainercontainer;公共容器erSpecimenBuilder(IContainer容器){this.container=container;}publicobjectCreate(objectrequest,ISpecimenContextcontext){varseededRequest=requestasSeededRequest;如果(seededRequest==null){returnnewNoSpecimen(request);}varresult=this.container.ResolveOptional(seededRequest.RequestasType);返回结果??新的NoSpecimen(请求);但是这种方法的问题是container.Resolve不会考虑在AutoFixture中注册的依赖项是否有任何替代方案可以修复更复杂的注册吗?一般方法似乎是合理的,但您应该将ContainerSpecimenBuilder添加到ResidueCollectors而不是自定义:fixture.ResidueCollectors.Add(newContainerSpecimenBuilder(containerBuilder.Build()));AutoMoqCustomization还将一个节点添加到ResidueCollectors,因此您可能需要将一个节点添加到ResidueCollectors对特定的排序进行一些试验,以确切了解如何使其按照您希望的方式运行。订购很重要。有关Customizations和ResidueCollectors之间差异的更多信息,请参阅AutoFixtureArchitectureDocumentation。ContainerSpecimenBuilder的一个稍微简单(并且更安全?)的实现可能只是直接处理对Type实例的请求,而不是SeededRequest,因为几乎所有的SeededRequest值都被中继到对Type对象的请求:设置更复杂的(类似IoC的)注册和分享所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注—internalclassContainerSpecimenBuilder:ISpecimenBuilder{privatereadonlyIContainercontainer;publicContainerSpecimenBuilder(IContainercontainer){this.container=container;}publicobjectCreate(objectrequest,ISpecimenContextcontext){vart=requestasType;如果(t==null)返回新的NoSpecimen(请求);varresult=this.container.解决可选(t);返回结果??新的NoSpecimen(请求);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: