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

AsV*_*leO 2 c# interface moq autofixture automoq

例如ISomething,一个具有三个属性的接口:string Nameint Count一些复杂的属性ImComplex(具有循环依赖性等),我不想自动构建.所以我需要AutoFixture来创建一个Mock of ISomethingwith NameCount通过其默认算法设置并ImComplex为null.但如果我试图像这样解决它我会得到一个例外:

fixture.Customize(new AutoConfiguredMoqCustomization());
var some = fixture.Build<ISomething>().Without(x=>x.ImComplex).Create<ISomething>();
Run Code Online (Sandbox Code Playgroud)

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

我该怎么办?

dca*_*tro 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));
    
    Run Code Online (Sandbox Code Playgroud)