2017-07-06 77 views
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和旋繞。是否有一種更簡單和/或更爲慣用的方式來實現同樣的事情,即測試兩個仲裁結果的笛卡兒積?

回答

0

您可以使用Gen.Shuffle來生成不同的順序序列:

var gen = from input in Gen.Choose(1, 5) 
      let sc = GetStuffCollection(input) 
      from shuffled in Gen.Shuffle(sc) 
      select shuffled 

然後

Prop.ForAll(gen, collection => { ... })