【问题标题】:AutoFixture + AutoMoq: Create mock with excluded propertyAutoFixture + AutoMoq:创建具有排除属性的模拟
【发布时间】:2015-11-28 16:40:38
【问题描述】:

例如 ISomething 是一个具有三个属性的接口:string Nameint Count 以及一些复杂的属性 ImComplex(具有循环依赖等),我不想建立 AutoFixture。所以我需要 AutoFixture 来创建一个 ISomething 的 Mock,其中 NameCount 由其默认算法设置,ImComplex 为空。但是,如果我尝试像这样解决它,我会得到一个异常:

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

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

我该怎么办?

【问题讨论】:

    标签: c# interface moq autofixture automoq


    【解决方案1】:

    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));
      

    【讨论】:

    • 谢谢! Entity Framework 的实体具有导致循环依赖的导航属性。我尝试使用 OmitOnRecursionBehavior 但没有成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多