简体   繁体   English

来自 Autofixture 声明性自动数据参数的属性的集合大小

[英]Collection size from attribute for Autofixture declarative autodata parameter

How to a specify a list/enumerable's length/size using an attribute on a property passed into a test using Autofixture's declarative parameter style?如何使用 Autofixture 的声明性参数样式传递给测试的属性上的属性指定列表/可枚举的长度/大小?

I want to be able to make this test pass without moving parameters into the test body.我希望能够在不将参数移动到测试主体的情况下通过此测试。

        [Theory, AutoData]
        public void CollectionSizeTest(
            List<int> defaultSize,
            List<int> customSize,
            List<int> customSize2,
            IEnumerable<string> empty
        )
        {
            Assert.Equal(3, defaultSize.Count);
            Assert.Equal(5, customSize.Count);
            Assert.Equal(6, customSize2.Count);
            Assert.Empty(empty);
        }

You can create a custom attribute for this, such as this CollectionSizeAttribute :您可以为此创建自定义属性,例如此CollectionSizeAttribute

        [Theory, AutoData]
        public void CollectionSizeTest(
            List<int> defaultSize,
            [CollectionSize(5)] List<int> customSize,
            [CollectionSize(6)] List<int> customSize2,
            [CollectionSize(0)] IEnumerable<string> empty,
            List<string> defaultSize2
        )
        {
            Assert.Equal(3, defaultSize.Count);
            Assert.Equal(5, customSize.Count);
            Assert.Equal(6, customSize2.Count);
            Assert.Empty(empty);
            Assert.Equal(3, defaultSize2.Count);
        }

        public class CollectionSizeAttribute : CustomizeAttribute
        {
            private readonly int _size;

            public CollectionSizeAttribute(int size)
            {
                _size = size;
            }

            public override ICustomization GetCustomization(ParameterInfo parameter)
            {
                if (parameter == null) throw new ArgumentNullException(nameof(parameter));

                var objectType = parameter.ParameterType.GetGenericArguments()[0];

                var isTypeCompatible =
                    parameter.ParameterType.IsGenericType
                    && parameter.ParameterType.GetGenericTypeDefinition().MakeGenericType(objectType).IsAssignableFrom(typeof(List<>).MakeGenericType(objectType))
                ;
                if (!isTypeCompatible)
                {
                    throw new InvalidOperationException($"{nameof(CollectionSizeAttribute)} specified for type incompatible with List: {parameter.ParameterType} {parameter.Name}");
                }

                var customizationType = typeof(CollectionSizeCustomization<>).MakeGenericType(objectType);
                return (ICustomization) Activator.CreateInstance(customizationType, parameter, _size);
            }

            public class CollectionSizeCustomization<T> : ICustomization
            {
                private readonly ParameterInfo _parameter;
                private readonly int _repeatCount;

                public CollectionSizeCustomization(ParameterInfo parameter, int repeatCount)
                {
                    _parameter = parameter;
                    _repeatCount = repeatCount;
                }

                public void Customize(IFixture fixture)
                {
                    fixture.Customizations.Add(new FilteringSpecimenBuilder(
                        new FixedBuilder(fixture.CreateMany<T>(_repeatCount).ToList()),
                        new EqualRequestSpecification(_parameter)
                    ));
                }
            }
        }

This causes the parameter to be created as a list with the given size by calling fixture.CreateMany<T>(_repeatCount) .这会通过调用fixture.CreateMany<T>(_repeatCount)将参数创建为具有给定大小的列表。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 为什么我们的测试方法参数的类型实例化不完整-AutoFixture和AutoData - Why do we have incomplete instantiation of types from the test method parameter - AutoFixture with AutoData 如何将基于约定的自定义项与AutoFixture的[AutoData]属性结合在一起? - How to combine a Convention-based Customization with AutoFixture's [AutoData] attribute? 具有参数的AutoFixture AutoData - AutoFixture AutoData with arguments 使用NUnit和AutoData的AutoFixture会抛出TargetParameterCountException - AutoFixture with NUnit and AutoData throws TargetParameterCountException AutoFixture 和 XUnit2 - 结合 TheoryData 和 AutoData - AutoFixture and XUnit2 - Combining TheoryData and AutoData 您可以在AutoFixture中将内联值与AutoData结合吗? - Can you combine inlined values with AutoData in AutoFixture? AutoFixture - 创建“有效”和“无效”实例和 [AutoData] - AutoFixture - Creation of “Valid” and “Invalid” instances and [AutoData] 使用 AutoFixture 和 AutoData 时如何生成默认的 UTC DateTime? - How to generate default UTC DateTime when using AutoFixture and AutoData? AutoFixture将PropertyData与多个条目和AutoData混合(使用AutoMoqCustomization) - AutoFixture mixing PropertyData with multiple entries and AutoData (using AutoMoqCustomization) 使用 AutoFixture 自定义集合 - Use AutoFixture to customize a collection
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM