【问题标题】:AutoFixture can't create an object which uses System.ComponentModel.DataAnnotations.RangeAttribute for decimal propertyAutoFixture 无法创建使用 System.ComponentModel.DataAnnotations.RangeAttribute 作为小数属性的对象
【发布时间】:2019-11-18 17:10:13
【问题描述】:

我有一个具有小数属性的模型,该属性具有Range 属性,并且范围由浮点数组成。我想使用AutoFixture 初始化模型,但它失败了。例如,请尝试运行下面的测试。

using System.ComponentModel.DataAnnotations;
using AutoFixture;
using Xunit;

namespace XUnitTestProject1
{
    public class UnitTest1
    {
        [Fact]
        public void AutoFixture_ShouldCreateInstanceOfMyModel()
        {
            var f = new Fixture();
            var randomValue = f.Create<MyModel>();
            Assert.NotNull(randomValue);
        }
    }

    public class MyModel
    {
        [Range(typeof(decimal), "0.1", "1000")]
        public decimal MyProp { get; set; }
    }
}

它失败了,但有以下异常:

Message: 
    AutoFixture.ObjectCreationExceptionWithPath : AutoFixture was unable to create an instance from RangedRequest (MemberType: System.Decimal, OperandType: System.Decimal Minimum: [String] 0.1, Maximum: [String] 1000) because creation unexpectedly failed with exception. Please refer to the inner exception to investigate the root cause of the failure.

    Request path:
        XUnitTestProject1.MyModel
          System.Decimal MyProp
            RangedRequest (MemberType: System.Decimal, OperandType: System.Decimal Minimum: [String] 0.1, Maximum: [String] 1000)

    Inner exception messages:
        System.ArgumentException: 0.1 is not a valid value for Decimal.
    Parameter name: value
          System.FormatException: Input string was not in a correct format.


    ---- System.ArgumentException : 0.1 is not a valid value for Decimal.
    Parameter name: value
    -------- System.FormatException : Input string was not in a correct format.
  Stack Trace: 
    at TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) in TerminatingWithPathSpecimenBuilder.cs line: 81
    at RecursionGuard.Create(Object request, ISpecimenContext context) in RecursionGuard.cs line: 176
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) in TerminatingWithPathSpecimenBuilder.cs line: 57
    at RecursionGuard.Create(Object request, ISpecimenContext context) in RecursionGuard.cs line: 176
    at AutoPropertiesCommand`1.Execute(Object specimen, ISpecimenContext context) in AutoPropertiesCommand.cs line: 254
    at Postprocessor`1.Create(Object request, ISpecimenContext context) in Postprocessor.cs line: 290
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) in TerminatingWithPathSpecimenBuilder.cs line: 57
    at RecursionGuard.Create(Object request, ISpecimenContext context) in RecursionGuard.cs line: 176
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at Postprocessor`1.Create(Object request, ISpecimenContext context) in Postprocessor.cs line: 272
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) in TerminatingWithPathSpecimenBuilder.cs line: 57
    at RecursionGuard.Create(Object request, ISpecimenContext context) in RecursionGuard.cs line: 176
    at SpecimenFactory.Create[T](ISpecimenContext context) in SpecimenFactory.cs line: 25
    at UnitTest1.AutoFixture_ShouldCreateInstanceOfMyModel() in UnitTest1.cs line: 13
    at ----- Inner Stack Trace -----
    at BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)
    at RangedRequest.GetConvertedRangeBoundary(Object attributeValue, Type conversionType) in RangedRequest.cs line: 144
    at NumericRangedRequestRelay.Create(Object request, ISpecimenContext context) in NumericRangedRequestRelay.cs line: 32
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context) in CompositeSpecimenBuilder.cs line: 52
    at TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context) in TerminatingWithPathSpecimenBuilder.cs line: 57
    at ----- Inner Stack Trace -----
    at Number.StringToNumber(ReadOnlySpan`1 str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
    at Number.ParseDecimal(ReadOnlySpan`1 value, NumberStyles options, NumberFormatInfo numfmt)
    at Decimal.Parse(String s, NumberStyles style, IFormatProvider provider)
    at DecimalConverter.FromString(String value, NumberFormatInfo formatInfo)
    at BaseNumberConverter.ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, Object value)

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: autofixture


    【解决方案1】:

    同样的问题..

    问题不是自动夹具,而是范围属性不支持小数。它创建了一个 double than casts 。

    我最终用自定义验证器替换了范围,但这也有效

        [Range(0.01, 100000000, ErrorMessage = "Please enter a value bigger than {1}")] 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 2021-07-20
      • 1970-01-01
      • 2016-05-14
      相关资源
      最近更新 更多