2017-03-10 11 views
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(); 
     } 
    } 
+0

デフォルトの実装である 'shrink'を使用しているので、ジェネレータを定義して' DiscountAmounts'に渡すこともできます。次に、 'arbitrary'インスタンスを別々に登録します。 – Lee

答えて

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(); 
    } 
} 
関連する問題