Moq 为自动模拟设置自定义AutoDataAttribute时,需要什么';告诉AutoFixture忽略所有递归结构的正确语法是什么?

Moq 为自动模拟设置自定义AutoDataAttribute时,需要什么';告诉AutoFixture忽略所有递归结构的正确语法是什么?,moq,xunit,autofixture,automocking,automoq,Moq,Xunit,Autofixture,Automocking,Automoq,我让xUnit/Moq/AutoFixture成功地协同工作,以便通过测试方法输入参数自动模拟对象。我创建了一个自定义的[AutoMoqData]属性,我在每次测试中都使用它。以下是该属性的代码: using System.Linq; using AutoFixture; using AutoFixture.AutoMoq; using AutoFixture.Xunit2; namespace Shared.TestResources.AutoFixture { public cla

我让xUnit/Moq/AutoFixture成功地协同工作,以便通过测试方法输入参数自动模拟对象。我创建了一个自定义的
[AutoMoqData]
属性,我在每次测试中都使用它。以下是该属性的代码:

using System.Linq;
using AutoFixture;
using AutoFixture.AutoMoq;
using AutoFixture.Xunit2;

namespace Shared.TestResources.AutoFixture
{
    public class AutoMoqDataAttribute : AutoDataAttribute
    {
        public AutoMoqDataAttribute() : base(() => new Fixture().Customize(new CompositeCustomization(new AutoMoqCustomization(), new SupportMutableValueTypesCustomization())))
        {
            this.Fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b => Fixture.Behaviors.Remove(b));
            this.Fixture.Behaviors.Add(new OmitOnRecursionBehavior());
        }
    }
}
然而,我想正确地设置它,而不必假装警告不存在。问题是,我很难找出
#pragma
中两行的正确语法


有什么想法吗?

在返回之前,只需使用带有主体的lambda来额外配置
fixture
实例:

公共类automoqdata属性:AutoDataAttribute
{
公共AutoMoqDataAttribute():基(()=>
{
var fixture=new fixture().Customize(新合成)自定义(
新的AutoMoqCustomization(),
新的SupportMutableValueTypesCustomization());
fixture.Behaviors.OfType().ToList().ForEach(b=>fixture.Behaviors.Remove(b));
fixture.Behaviors.Add(新的省略递归行为());
返回夹具;
})
{
}
}

这样,
Fixture
激活将真正延迟,您将获得预期的性能优化;-)

我们在类似的设置中使用xUnit/NSubstitute/AutoFixture。我们的结论是,您不应该使用AutoFixture,因为它与ncrunch(或任何依赖静态分析来选择需要运行的测试的其他东西;即任何快速运行单元测试的东西)不兼容,并且导致误判的频率比发现未发现的特殊情况要高得多;i、 e.CI失败的原因与最近的更改无关。@RobertJørgensgaardEngdahl事实上,AutoFixture与NCrunch完全兼容,正如工具开发人员所说。对于xUnit来说尤其如此,它通过动态数据(AutoFixture所依赖的数据)为理论提供本地支持。如果您发现任何问题,请向AutoFixture或NCrunch报告,具体取决于它们的来源。我承认有几种方法可以同时使用NCrunch和AutoFixture(问题不在于NCrunch,它是一个具有强大支持的惊人工具)。我也承认,(通过仔细设计)可以避免误报。但出于我上面给出的相同原因,我仍然不建议使用AutoFixture。它是b.t.w.不完全兼容的。在你自己的链接中,Remco准确地解释了它什么时候不起作用:)恐怕我们只是围绕这个话题进行猜测,没有具体的事实。据我所知和经验,AutoFixture与NCrunch完全兼容,没有任何问题。如果您知道存在问题,请报告这些问题,以便我们可以一起进行调查和故障排除。Remco也证实了这一点(如果您仔细阅读并遵循整个主题)。我只想略去谣言散播的情况。这两种工具都很好,人们只能从两者中受益。
using System.Linq;
using AutoFixture;
using AutoFixture.AutoMoq;
using AutoFixture.Xunit2;

namespace Shared.TestResources.AutoFixture
{
    public class AutoMoqDataAttribute : AutoDataAttribute
    {
        public AutoMoqDataAttribute() : base(() => new Fixture().Customize(new CompositeCustomization(new AutoMoqCustomization(), new SupportMutableValueTypesCustomization())))
        {
#pragma warning disable 0618
            this.Fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList().ForEach(b => Fixture.Behaviors.Remove(b));
            this.Fixture.Behaviors.Add(new OmitOnRecursionBehavior());
#pragma warning restore 0618
        }
    }
}