这是编写任意项的好策略吗?
Is this a good strategy for composing arbitraries?
刚开始看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();
}
}
我的建议是,如果您有不同的相关任意实例,将它们添加到同一个 class 并在不同实例之间存在依赖关系时直接调用方法。然后在测试中使用任何 Arbitrary 实例时,一次注册它们。
这使您的代码对执行顺序的依赖性降低(Arb.Register 是一种根本性的副作用操作,这可能会导致一些意外结果)。将 Arbitrary 方法放在不同的 classes 上并没有真正的优势。所以我会重写你的内容如下:
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();
}
}
刚开始看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();
}
}
我的建议是,如果您有不同的相关任意实例,将它们添加到同一个 class 并在不同实例之间存在依赖关系时直接调用方法。然后在测试中使用任何 Arbitrary 实例时,一次注册它们。
这使您的代码对执行顺序的依赖性降低(Arb.Register 是一种根本性的副作用操作,这可能会导致一些意外结果)。将 Arbitrary 方法放在不同的 classes 上并没有真正的优势。所以我会重写你的内容如下:
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();
}
}