2012-12-12 4 views
6

私はF#でいくつかのNUnitテストを書こうとしており、関数をThrowsConstraintに渡すことに問題があります。蒸留された(非)作業サンプルは以下の通りです。関数をNUnit Throws Constraintに渡すにはどうすればよいですか?

open System.IO 
open NUnit.Framework 

[<TestFixture>] 
module Example = 

    [<Test>] 
    let foo() = 
     let f = fun() -> File.GetAttributes("non-existing.file") 
     Assert.That(f, Throws.TypeOf<FileNotFoundException>()) 

これはうまくコンパイルが、私はNUnitのテストランナーから次を得る:

FsTest.Tests.Example.foo: 
System.ArgumentException : The actual value must be a TestDelegate but was [email protected] 
Parameter name: actual 

私はExpectedException属性を使用して問題を回避することができるよ一方で、私の質問が正しいものですこのような状況でF#関数を使用する方法は?

答えて

7

元のスニペットを機能させるために必要な作業は、TestDelegateunit -> unit)に準拠するようにfを固定することです。ただ、File.GetAttributesの戻り値を破棄:ちょうど別のフィッティングNUnitの過負荷Assert.That(actual: obj, expression: Constraints.IResolveConstraint)が存在するため

let f = fun() -> File.GetAttributes("non-existing.file") |> ignore 

F#コンパイラは、元のコードで嘔吐しませんでした。 F#コンパイラは、静的に、あなたの関数の間違った署名を見つけることができるだろう

[<Test>] 
let foo() = 
    Assert.Throws<FileNotFoundException> 
     (fun() -> File.GetAttributes("non-existing.file")|> ignore) 
    |> ignore 

Assert.Thatとして

は、私は例えば、より具体的なアサートフォームにテスト予想の例外のために固執したい非常に幅広い使い方があります。

+0

説明をいただきありがとうございます。 –

+0

F#(VS 2010)属性のアプローチが私のために働いていなかったので、良い解決策です(ExpectedException属性のテストメソッドをマークしようとしましたが、全く動作しませんでした) ありがとう! – Roboblob

4

IMHO、あなたはNUnitの上にUnquoteを使用することで、いくらかの痛みを救うことができます。次に、あなたの主張は、予期しない実行時の動作とアサーションのオーバーロードのNUnitのの広いスイートには、F#に比べて表現力のC#の相対的な不足を補うように設計されてい

[<Test>] 
let foo() = 
    raises<FileNotFoundException> <@ File.GetAttributes("non-existing.file") @> 

ような単純なものでしょう。

オン - 他の手F#は既にそのようなエレガントなアサーションを表現するための構造の比較などの機能が装備されているので、UNQUOTEはちょうど3つの単純なアサーション・オペレータとのネイティブ機能を活用するように設計されている:raisestest、及びraisesWith

+0

+1はUnquoteに言及しています。 –

+0

unquoteが私が試した最初のことだったので、かなり面白いです。残念ながら、NUnitとunquoteの組み合わせは私のためにはうまくいかなかったので、私はNUnitの主張に戻りました。私はNUnitで持っていた問題を要約し、引用符をつけずに[別の質問](http://stackoverflow.com/questions/13846561/missingmethodexception-when-using-unquote-asserts)として投稿しました。感謝する。 –

+0

申し訳ありません@SergeBelov、それは残念です!あなたの新しい質問にコメントを追加しました。あなたが持っている問題はUnquote自体ではなく、むしろNUnitテストランナーアセンブリのロード/設定やそれらの行に沿った問題であると私は考えています。 –

関連する問題