fscheck ライブラリを使用してプロパティ ベースのテストを作成する方法を学ぶために、ダイヤモンド カタを解決しようとしています。C# でテストを書きたいのですが、Visual Studio 2017 を使用しています。
入力としてランダムな文字を生成せず、文字のみを生成するプロパティ ベースのテストを作成したいと考えています。fscheck がこれを行うために必要なジェネレーターを記述する方法と、コードを配置するファイルがわかりません。
どこでも検索してドキュメントを読みましたが、問題が発生しています (F# を C# にうまく変換できないためです)。
[Property]
入力データを文字のみに制限するためにどのように使用されますか?
より良いアプローチがあれば、私に知らせてください。
[編集:]
コード例を編集しました。これには、Kurt Schelfthout による実用的なソリューションが 1 つ含まれています。
テスト
using DiamondKata;
using FsCheck;
using FsCheck.Xunit;
using Xunit;
namespace DiamondKataTests
{
public static class Arbitraries
{
private static readonly string upperAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static readonly string lowerAlphabet = ""; //upperAlphabet.ToLower();
private static readonly char[] wholeAlphabet = (lowerAlphabet + upperAlphabet).ToCharArray();
public static Arbitrary<char> LetterGenerator()
{
return Gen.Elements(wholeAlphabet).ToArbitrary();
}
}
public class DiamondKataTests
{
// THIS WORKS and is apparently the preferred way of doing things
// also see here: https://stackoverflow.com/questions/32811322/fscheck-in-c-generate-a-list-of-two-dimension-arrays-with-the-same-shape
[Property()]
public Property shouldReturnStringAssumesValidCharWasProvided()
{
return Prop.ForAll(Arbitraries.LetterGenerator(), letter =>
// test here
Assert.NotNull(Diamond.Create(letter))
);
}
// Second solution ...
// Error here: Arbitraries is a type not valid in the given context
[Property(Arbitrary = new[] { typeof<Arbitraries> })]
public void testThatAssumesValidCharWasProvided(char lettersOnlyHERE)
{
// ?
}
}
}
テストするクラス
namespace DiamondKata
{
public class Diamond
{
public static string Create(char turningPointCharacter)
{
return "";
}
}
}