AutoFixture + AutoMoq:使用排除属性创建模拟

时间:2015-11-28 16:40:38

标签: c# interface moq autofixture automoq

例如ISomething是一个包含三个属性的接口:string Nameint Count以及一些复杂的属性ImComplex(具有循环依赖关系等),我不知道想要AutoFixture建立起来。因此,我需要AutoFixture来创建ISomething的模拟,其NameCount由其默认算法设置,ImComplex为null。但如果我试图像这样解决它,我得到一个例外:

fixture.Customize(new AutoConfiguredMoqCustomization());
var some = fixture.Build<ISomething>().Without(x=>x.ImComplex).Create<ISomething>();
  

Ploeh.AutoFixture.ObjectCreationException:装饰   ISpecimenBuilder无法根据请求创建样本:   RP.Core.IInformationUnit。如果请求代表一个,则会发生这种情况   接口或抽象类;如果是这种情况,请注册   ISpecimenBuilder,可根据要求创建标本。如果   这发生在一个强类型的Build表达式中,尝试提供一个   工厂使用IFactoryComposer方法之一。

我该怎么办?

1 个答案:

答案 0 :(得分:5)

Build停用所有自定义项(如方法文档中所述),因此无法与AutoConfiguredMoqCustomization一起使用。

如果问题是该属性具有循环依赖性,那么您可以:

  1. 重新考虑你的设计(默认情况下,AutoFixture在找到循环依赖时会抛出它,因为它们通常都是设计气味)
  2. 配置AutoFixture以允许循环依赖,直到某个深度

    fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList()
        .ForEach(b => fixture.Behaviors.Remove(b));
    
    int recursionDepth = 2;
    fixture.Behaviors.Add(new OmitOnRecursionBehavior(recursionDepth));