2017-07-16 4 views
1

デリゲートがFooExceptionをスローしないことをテストしたいが、それが何かをスローするかどうかは気にしない。したがって、Nothingという制約は使用できません。特定の例外をスローしないデリゲートのNUnit制約

制約モデルはこのような何かを持っていない:

Assert.That(del, Throws.Not.InstanceOf<FooException>()); //can't use Not like this 

は何とかその可能ですか?

+0

例外をキャッチして、それが 'FooException'のインスタンスではないことを確認しようとしましたか?何かがこれを疑う:Assert.IsNotInstanceOf (exc) ' –

+0

@GeorgeAlexandriaうん、それは私がやっていることだが、それは乱雑だ。私はそれを行う方法で構築されていることを望んでいた。 – grokky

答えて

2

これはちょっとawkwarですDそれ個人的に

Assert.That(Assert.Catch(del), Is.Null.Or.Not.TypeOf<FooException>()); 

を行う必要がありますが、私は2つのライン版

var ex = Assert.Catch(del); 
Assert.That(ex, Is.Null.Or.Not.TypeOf<FooException>()); 

かさえ明確3-ライナーですべてです主張していないので、これは動作します

var ex = Assert.Catch(del); 
if (ex != null) 
    Assert.That(ex, Is.Not.TypeOf<FooException>()); 

に好みます成功と同じ。

構文でこれをテストするための直接的な方法がないことは、開発者の意見が反映されています。

+0

すべての異なるオプションをありがとう!ガード/チェック文をテストするときに、あなたが知らないかもしれない少なくとも1つのケースがあります。私は、データが悪い場合はそれが何かを知っているが、それ以外はそうではない(気にしないで、悪いデータに対して特定のやり方でそれに気をつけてください)。 – grokky

2

nunitはそれを箱から出してくれないようです。
しかし、あなたは、いくつかの回避策を持っている:ThrowsNothingConstraint

よう

del.ShouldNotThrow<FooException>(); 

はまた、あなたがあなた自身のcustom-constraintsを書くことができ、:
あなたは次のアサーションを行うことができますFluentAssertionsのような追加のアサーションの枠組み、 を使用することができますまたはカスタムメトリックを書くことができます

public void AssertException<T>(Action act) where T : Exception 
{ 
    try 
    { 
     act(); 
    } 
    catch (T e) 
    { 
     Assert.Fail(); 
    } 
    catch (Exception e) 
    { 
     Assert.Pass(); 
    } 
} 
関連する問題