0

刚开始看 FsCheck,写了几个测试,现在我想知道什么是编写更复杂的任意值的好策略。是否在任意好的方法中注册任意项?像这样的东西

public class DiscountAmountArbitrator
    {
        public static Arbitrary<DiscountAmount> DiscountAmounts()
        {
            Arb.Register<AmountArbitrary>();

            var toReturn = (from a in Arb.Generate<Amount>()
                            select new DiscountAmount(a))
                          .ToArbitrary();

            return toReturn;
        }
    }

 public class AmountArbitrary
    {
        public static Arbitrary<Amount> Amounts()
        {
            return Arb.Generate<decimal>().Where(x => x > 0)
                .Select(x => new Amount(x))
                .ToArbitrary();
        }
    } 
4

1 回答 1

0

我的建议是,如果您有不同的相关任意实例,请将它们添加到同一个类中,并在不同实例之间存在依赖关系时直接调用方法。然后在测试中使用任意实例时,一次注册它们。

这使您的代码对执行顺序的依赖性降低(Arb.Register 基本上是一个副作用操作,这可能会导致一些意外结果)。将任意方法放在不同的类上并没有真正的优势。所以我会重写你所拥有的如下:

public class Arbitraries
{
    public static Arbitrary<DiscountAmount> DiscountAmounts()
    {
        var toReturn = (from a in Amounts().Generator
                        select new DiscountAmount(a))
                      .ToArbitrary();

        return toReturn;
    }

    public static Arbitrary<Amount> Amounts()
    {
        return Arb.Generate<decimal>().Where(x => x > 0)
            .Select(x => new Amount(x))
            .ToArbitrary();
    }
} 
于 2017-03-13T10:15:42.553 回答