C# 这是一个很好的组合套利策略吗?
刚开始研究FsCheck,编写了几个测试,现在我想知道,对于编写更复杂的任意性,什么是一个好的策略。在任意的范围内登记任意性是一个好方法吗?像这样的C# 这是一个很好的组合套利策略吗?,c#,fscheck,C#,Fscheck,刚开始研究FsCheck,编写了几个测试,现在我想知道,对于编写更复杂的任意性,什么是一个好的策略。在任意的范围内登记任意性是一个好方法吗?像这样的 public class DiscountAmountArbitrator { public static Arbitrary<DiscountAmount> DiscountAmounts() { Arb.Register<AmountArbitrary>()
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();
}
}
公共类折扣
{
公共静态任意折扣()
{
Arb.Register();
var toReturn=(来自Arb.Generate()中的a)
选择新折扣(a))
.ToArbitrary();
回归回归;
}
}
公共类任意变量
{
公共静态任意金额()
{
返回Arb.Generate(),其中(x=>x>0)
.选择(x=>新金额(x))
.ToArbitrary();
}
}
我的建议是,如果您有不同的相关任意实例,请将它们添加到同一个类中,并在不同实例之间存在依赖关系时直接调用这些方法。然后,当在测试中使用任意实例时,立即注册它们
这使得代码不太依赖于执行的顺序(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();
}
}
公共类仲裁
{
公共静态任意折扣()
{
var toReturn=(来自一个in Amounts()生成器
选择新折扣(a))
.ToArbitrary();
回归回归;
}
公共静态任意金额()
{
返回Arb.Generate(),其中(x=>x>0)
.选择(x=>新金额(x))
.ToArbitrary();
}
}
由于您使用的是shrink
的默认实现,您最好只定义生成器并将其传递到DiscountAmounts
。然后分别注册任意
实例。