2013-04-28 14 views
8

FsUnitで例外を正しくテストする方法を理解しようとしています。 [<ExpectedException>]が、それは常に失敗する属性で、私は私のテストメソッドをマークしていない場合は、FsUnitで例外を正しくテストする方法

(fun() -> failwith "BOOM!" |> ignore) |> should throw typeof<System.Exception> 

しかし:公式ドキュメントの状態は、それがこのような右の何かに私が持っている例外をテストします。なぜなら、例外をテストするには、C#+ NUnitでそのような属性を追加する必要があるからです。

ただし、この属性を追加している限り、どのような種類の例外をスローしようとしても問題はありません。常に処理されます。

一部抜粋: マイLogicModule.fs

exception EmptyStringException of string 

let getNumber str = 
    if str = "" then raise (EmptyStringException("Can not extract number from empty string")) 
    else int str 

マイLogicModuleTest.fs

[<Test>] 
[<ExpectedException>] 
let``check exception``()= 
    (getNumber "") |> should throw typeof<LogicModule.EmptyStringException> 
+2

をリターンを上げます - Unquote、https://code.google.com/p/unquote/を使用すると、 'getNumber" "は後者の例では' raise <@ getNumber "" @ > ' –

答えて

15

回答が見つかりました。テストするには、その例外は、私は次のスタイルで私の関数呼び出しをラップする必要がありますスローされました:

(fun() -> getNumber "" |> ignore) |> should throw typeof<LogicModule.EmptyStringException> 

下#fsunitは、NUnitののは、ボイドのデリゲートをとる制約 http://www.nunit.org/index.php?p=throwsConstraint&r=2.5を...例外使用しているため、「FYI

+0

えええええええええええええええええええええええええええええええんえん属性がほしいとは思わない。 – TrueWill

+0

ラムダからユニットを返すこと(つまり、 '|> ignore'で楽しい定義を終了すること)が必要であることに注意してください。 –

3

あなたが特定の例外タイプは、いくつかのコードによって発生していることをテストしたい場合は、追加することができます次のような[<ExpectedException>]属性の例外タイプ:

[<Test; ExpectedException(typeof<LogicModule.EmptyStringException>)>] 
let``check exception``() : unit = 
    (getNumber "") 
    |> ignore 

詳細は、NUnitサイトで入手できます。http://www.nunit.org/index.php?p=exception&r=2.6.2

+0

答えをありがとうございますが、私はFsUnitを使用しているときにそれほど大きく見えないので、いくつかの追加属性を追加する考えが嫌いです。 – PompolutZ

関連する問題