2017-10-19 44 views
3

FsCheckには、テストデータを生成するためのいくつかのきちんとしたデフォルトのArbitraryタイプがあります。しかし、私の試験日のうちの1つが別のものに依存するとどうなりますか?例えばFsCheck:他のテストデータに依存するテストデータの生成方法?

、結果のストリングが長い入力文字列よりなることはありませんことをstring.Substring()の性質を考慮してください。

[Fact] 
public void SubstringIsNeverLongerThanInputString() 
{ 
    Prop.ForAll(
     Arb.Default.NonEmptyString(), 
     Arb.Default.PositiveInt(), 
     (input, length) => input.Get.Substring(0, length.Get).Length <= input.Get.Length 
    ).QuickCheckThrowOnFailure(); 
} 

ので、最終的にPositiveInt意志Substringの実装は確かに、このプロパティは失敗し、正しいですが、 genereated NonEmptyStringよりも長いものが生成され、例外が発生します。

Shrunk:NonEmptyString "a" PositiveInt 2例外:System.ArgumentOutOfRangeException:インデックスと長さは、文字列内の場所を参照する必要があります。

私はif (input.Length < length) return true;との比較を守ることができましたが、そのようにしても、多くのテストを実行するとそのプロパティはチェックされませんでした。

入力文字列を超えないPositiveIntを生成するようにFsCheckに指示するにはどうすればよいですか?私はGen<T>クラスを使用する必要が推測、それはインターフェイスですが、私には混乱だけヘラです...私は次のことを試してみましたが、それでも文字列を超えるPositiveInt Sを得た:

var inputs = Arb.Default.NonEmptyString(); 
// I have no idea what I'm doing here... 
var lengths = inputs.Generator.Select(s => s.Get.Length).ToArbitrary(); 

Prop.ForAll(
    inputs, 
    lengths, 
    (input, length) => input.Get.Substring(0, length).Length <= input.Get.Length 
).QuickCheckThrowOnFailure(); 
+0

https://fscheck.github.io/FsCheck/TestData.html – MethodMan

+0

私はすでに、このサイトを通じて複数回を見て、まだ私が欲しいものを行う方法を見つけ出すことができませんでした。 –

答えて

4

あなたが値に依存ジェネレータを作成することができますSelectManyを使用して別のものから生成されます。また、LINQクエリ構文を使用することもできます。

var gen = from s in Arb.Generate<NonEmptyString>() 
      from i in Gen.Choose(0, s.Get.Length - 1) 
      select Tuple.Create(s, i); 

var p = Prop.ForAll(Arb.From(gen), t => 
{ 
    var s = t.Item1.Get; 
    var len = t.Item2; 
    return s.Substring(0, len).Length <= s.Length; 
}); 

Check.Quick(p); 
+0

これは私が[official docs](https://fscheck.github.io/FsCheck/TestData.html)で見つけられたものですか?あなたが参照を追加してくださいできない場合は? –

+2

@ GoodNightNerdPride - 私はC#interopに関する多くのドキュメントを見たことがないと思いますので、ソースを読み、 'gen'ビルダーから推測された推測に基づいていることがわかりました。 F#の計算式( 'gen {...}'のようなもの)は、C#LINQのクエリ構文と非常に密接に結びついています。 – Lee

+1

F#計算式またはLINQ構文の多くの例はドキュメントにありません。 TestDataページの2番目の段落にhttps://github.com/fscheck/FsCheck/blob/master/examples/FsCheck.CSharpExamples/Program.cs#L150 LINQの例があります。ここには小さな例があります: https://fscheck.github.io/FsCheck/TestData.html#Generators –