1

パラメータ (例: a string) を受け取り、smth を実行する単純なメソッドを作成する必要があります。通常、私は2つのテストで終わります。最初のものはガード句です。2 番目は、予想される動作を検証します (簡単にするために、メソッドは失敗しないはずです)。

[Fact]
public void DoSmth_WithNull_Throws()
{
    var sut = new Sut();
    Assert.Throws<ArgumentNullException>(() =>
        sut.DoSmth(null));
}

[Fact]
public void DoSmth_WithValidString_DoesNotThrow()
{
    var s = "123";
    var sut = new Sut();
    sut.DoSmth(s); // does not throw
}

public class Sut
{
    public void DoSmth(string s)
    {
        if (s == null)
            throw new ArgumentNullException();

        // do smth important here
    }
}

FsCheck [Property]属性を使用してランダム データを生成しようとするnullと、他の多数のランダム値がテストに渡され、ある時点で NRE が発生します。

[Property]
public void DoSmth_WithValidString_DoesNotThrow(string s)
{
    var sut = new Sut();
    sut.DoSmth(s); // throws ArgumentNullException after 'x' tests
}

これが、さまざまなケースをカバーするために多数のランダム データを生成するという FsCheck の全体的なアイデアであることを認識しています。これは間違いなく素晴らしいことです。

望ましくない[Property]を除外するように属性を構成するエレガントな方法はありますか? (この特定のテストでは、それは です)。null

4

1 に答える 1

3

FsCheck には、たとえば、参照型の値が null であってはならないなど、特定の動作を通知するために使用できる組み込み型がいくつかあります。これらの 1 つですNonNull<'a>。生の文字列を要求する代わりに、これらのいずれかを要求すると、null は取得されません。

F# では、関数の引数として構造を解除できます。

[<Property>]
let DoSmth_WithValidString_DoesNotThrow (NonNull s) = // s is already a string here...
    let sut = Sut ()
    sut.DoSmth s // Use your favourite assertion library here...
}

C# では、次のようになるはずですが、試していません。

[Property]
public void DoSmth_WithValidString_DoesNotThrow(NonNull<string> s)
{
    var sut = new Sut();
    sut.DoSmth(s.Get); // throws ArgumentNullException after 'x' tests
}
于 2016-12-07T16:42:16.717 に答える