2

xUnit と FsCheck を使用して F# で記述されたテストを使用して、C# で Diamond Kata を実行しています。 t 発音記号のないアルファベット)。コードは次のようになります。

テストされているメソッド:

public static string Make(char letter)
{
    if (!Regex.IsMatch(letter.ToString(), @"[a-zA-Z]"))
    {
        throw new InvalidOperationException();
    }

    // code that makes the diamond
}

テスト:

[<Property>]
let ``Diamond.Make must throw an InvalidOperationException if a character that isn't 
      an alphabet letter without any diacritics is given`` (letter : char) =
    (not (('A' <= letter && letter <= 'Z') || ('a' <= letter && letter <= 'z'))) ==> lazy 
        (Assert.Throws<InvalidOperationException>(fun () -> Diamond.Make letter |> ignore))

私のアプローチの問題は、テストでは例外がスローされないと示されていますが、テストスイートによって表示された入力でアプリケーションを実行すると、例外が発生することです。

テスト スイートによって表示されるメッセージは次のとおりです (意図的にテスト名とスタック トレースを省略しました)。

Test Outcome:   Failed
Test Duration:  0:00:00,066
Result Message: 
FsCheck.Xunit.PropertyFailedException : 
Falsifiable, after 1 test (0 shrinks) (StdGen (1154779780,296216747)):
Original:
')'
---- Assert.Throws() Failure
Expected: typeof(System.InvalidOperationException)
Actual:   (No exception was thrown)

テスト スイートは値に対して')'例外がスローされないと言っていますが、手動でテストを行ったところ、予想される例外が実際にスローされました。

例外がテストによってキャッチされることを確認するにはどうすればよいですか?

4

1 に答える 1

5

問題は、Assert.Throws が発生した場合に特定の型の例外を返すことだと思います。Assert.Throws の戻り値を無視するだけで役に立ちます。

let test (letter : char) =
    (not (('A' <= letter && letter <= 'Z') || ('a' <= letter && letter <= 'z'))) ==> 

    lazy
        Assert.Throws<InvalidOperationException>(fun () -> Diamond.Make letter |> ignore)
        |> ignore
于 2016-10-14T20:54:24.597 に答える