自定义AutoDataAttribute自动模拟:忽略递归结构语法及消除警告方案
问题1:在自定义AutoDataAttribute中配置忽略递归结构的正确语法
要让AutoFixture自动忽略递归结构,核心是在创建Fixture实例的工厂方法中替换它的递归行为:移除默认抛出异常的ThrowingRecursionBehavior,添加自动忽略递归节点的OmitOnRecursionBehavior。这种写法既符合AutoFixture的最新设计规范,也能避免过时API的警告。
问题2:解决CS0618警告的正确配置方案
你遇到的CS0618警告,是因为直接访问了已被标记为过时的AutoDataAttribute.Fixture属性——官方现在推荐在构造函数传入的工厂方法里完成所有Fixture自定义,以此实现延迟加载优化。只需要把原来修改Behaviors的代码移到创建Fixture的lambda表达式中即可,修改后的完整代码如下:
using System.Linq; using AutoFixture; using AutoFixture.AutoMoq; using AutoFixture.Xunit2; namespace Shared.TestResources.AutoFixture { public class AutoMoqDataAttribute : AutoDataAttribute { public AutoMoqDataAttribute() : base(() => { var fixture = new Fixture().Customize( new CompositeCustomization( new AutoMoqCustomization(), new SupportMutableValueTypesCustomization())); // 在这里处理递归行为,替代原来访问this.Fixture的代码 var throwingBehaviors = fixture.Behaviors.OfType<ThrowingRecursionBehavior>().ToList(); foreach (var behavior in throwingBehaviors) { fixture.Behaviors.Remove(behavior); } fixture.Behaviors.Add(new OmitOnRecursionBehavior()); return fixture; }) { } } }
补充简化写法
如果你觉得移除行为的代码有点繁琐,还可以用更简洁的链式调用实现相同效果:
// 替换原来的移除循环代码 fixture.Behaviors.RemoveAll(b => b is ThrowingRecursionBehavior); fixture.Behaviors.Add(new OmitOnRecursionBehavior());
这种修改方式完全遵循了AutoFixture的性能优化设计(延迟创建Fixture),彻底消除了过时API警告,不需要再用#pragma屏蔽。
内容的提问来源于stack exchange,提问作者Andr
相关产品推荐
相关产品推荐

