1
我有一個屬性,我想測試一個Stuff
的集合,其中一個Stuff
滿足某個屬性。我有一種方法可以生成滿足屬性的Stuff
,並且可以生成不包含Stuff
的方法。將兩臺發電機組合成一個任意的FsCheck
今天,我在做這樣的事情(是的,我在C#中使用FsCheck):
IEnumerable<Stuff> GetStuffCollection(int input)
{
yield return GenerateStuffSatisfyingProperty(input);
yield return GenerateStuffNotSatisfyingProperty(input);
}
[Fact]
public void PropertyForCollectionHolds()
{
Prop.ForAll(Arb.Choose(1,5), input =>
{
var collection = GetStuffCollection(input);
return collection.SatisfiesProperty();
}).VerboseCheckThrowOnFailure();
}
但這種硬編碼的順序,即其Stuff
滿足屬性的集合;我也想仲裁這一點。
一種方法是嵌套Prop.ForAll
調用;外一個生成的東西,其確定順序,和一個內其一是一個I具有上述而是將參數傳遞控制排序到集合助洗劑:
IEnumerable<Stuff> GetStuffCollection(int input, bool first)
{
if (first)
{
yield return GenerateStuffSatisfyingProperty(input);
yield return GenerateStuffNotSatisfyingProperty(input);
}
else
{
yield return GenerateStuffNotSatisfyingProperty(input);
yield return GenerateStuffSatisfyingProperty(input);
}
}
[Fact]
public void PropertyForCollectionHolds()
{
Prop.ForAll(Arb.Default.Bool(), first =>
Prop.ForAll(Arb.Choose(1,5), input =>
{
var collection = GetStuffCollection(input, first);
return collection.SatisfiesProperty();
}).VerboseCheckThrowOnFailure()
).VerboseCheckThrowOnFailure();
}
但這感覺klunky和旋繞。是否有一種更簡單和/或更爲慣用的方式來實現同樣的事情,即測試兩個仲裁結果的笛卡兒積?