8

如何修改浮点、双精度和小数的 AutoFixture 创建方法,以便在创建这些类型时它们也会有余数?

目前我这样做,但这会引发异常。

var fixture = new Fixture();
fixture.Customize<double>(sb => sb.FromFactory<double>(d => d * 1.33));   //This should add remainder
var value = fixture.Create<double>();
4

2 回答 2

11

尝试double通过使用相同类型 ( double) 的值来重新定义类型 ( ) 确实会产生无限递归。但是,您可以通过将种子输入更改为另一种类型来轻松完成这项工作 - 例如int

var fixture = new Fixture();
fixture.Customize<double>(c => c.FromFactory<int>(i => i * 1.33));
var value = fixture.Create<double>();

双打现在也倾向于具有小数值。

于 2013-07-17T06:12:53.373 回答
5

一种选择是使用自定义ISpecimenBuilder

var fixture = new Fixture();
fixture.Customizations.Add(
    new RandomDoublePrecisionFloatingPointSequenceGenerator());

RandomDoublePrecisionFloatingPointSequenceGenerator可能如下所示:

internal class RandomDoublePrecisionFloatingPointSequenceGenerator
    : ISpecimenBuilder
{
    private readonly object syncRoot;
    private readonly Random random;

    internal RandomDoublePrecisionFloatingPointSequenceGenerator()
    {
        this.syncRoot = new object();
        this.random = new Random();
    }

    public object Create(object request, ISpecimenContext context)
    {
        var type = request as Type;
        if (type == null)
            return new NoSpecimen(request);

        return this.CreateRandom(type);
    }

    private double GetNextRandom()
    {
        lock (this.syncRoot)
        {
            return this.random.NextDouble();
        }
    }

    private object CreateRandom(Type request)
    {
        switch (Type.GetTypeCode(request))
        {
            case TypeCode.Decimal:
                return (decimal)
                    this.GetNextRandom();

            case TypeCode.Double:
                return (double)
                    this.GetNextRandom();

            case TypeCode.Single:
                return (float)
                    this.GetNextRandom();

            default:
                return new NoSpecimen(request);
        }
    }
}
于 2013-07-16T20:58:03.080 回答