2010-11-19 11 views
1

私はNUnitとRhino Mocksを使用しています。私はAAA構文を使用し、セットアップ方法ではアレンジとアクトを行い、すべてのテスト方法はアサートです。ご想像のとおりNUnit SetUpでExpectedExceptionが発生する

[TestFixture] 
public class When_subSystem_throws_exception 
{ 
    SomeClass subject; // System under test 

    [SetUp] 
    public void Setup() 
    { 
     // Arrange 
     IDependency dependency = MockRepository.GenerateStub<IDependency>(); 
     dependency.Stub(m => m.DoStuff()).Throw(new Exception()); // This method is called from within SomeMethod() 

     subject = new SomeClass(dependency); 

     // Act 
     subject.SomeMethod("Invalid Input"); 
    } 

    // Assert 

    [Test] 
    public void should_log_an_exception_to_the_logger() 
    { 
     // Do stuff to verify that an exception has been logged 
    } 

    // More tests 
} 

は、のsomeMethodのコードは()、ウィッヒは、すべてのテストが(不要な)失敗します(予想通り)例外がスローされます。私はこれを回避することによってこれを行う。

try 
{ 
    // Act 
    subject.SomeMethod("Invalid Input"); 
} 
catch(Exception ex) 
{ 
    // Swallow, this exception is expected. 
} 

しかし、それはちょうど醜いです。私が行うことができるようにしたいと思い何

[SetUp] 
[ExpectedException] // <-- this works for Test methods, but not for SetUp methods 
public void Setup() 
{ 
    // etc... 
} 

ですが、私はそれのような何かを見つけることができません。

何か知っていますか?

答えて

2

ExpectedExceptionのような属性を使用するとよい考えはありません。 SetUpは、テストメソッドのために何かを準備することです、それは例外をスローするべきではありません。 スローする必要があり、コード行番号を制限したい場合。次に、次のように1行に入れてください:

try { subject.SomeMethod("Invalid Input"); }catch { } 
+0

例外がスローされたことをどうやって保証できますか? – Simone

+0

@Simoneごめんなさいあなたの言うことを理解できません。 –

+0

例外がスローされたかどうかをテストしたい場合は、どうすればこのようなコードで確認できますか?スローされた場合、スローされない場合と何も変わりません。 – Simone

2

セットアップでは動作しません。なぜなら、NUnitのバグのためではありません。

単体テストがSetUpメソッド内で例外をスローすることは非常に悪いことです。例外が期待される結果である特定のシナリオをテストする場合は、[Test]メソッド内で実行する必要があります。その後、コードを再配置する必要があります。

+0

なぜそれが悪い習慣になるのか分かりません。 SetUpの "Acts"(私のために与えられたもの)を実行するとき、それらの "Acts"にスローされる予想される例外は自然にSetUp内にもあります。私はtry-catchよりも洗練されたソリューションを探しています。 – dvdvorle

1

あなたの「行動」ステップは、設定ではなくテスト方法にする必要があります。

セットアップは、テストに必要な条件と共通のオブジェクトを設定するためのものです。つまり、共通または繰り返しの「アレンジ」ステップです。

各テストメソッドは個別に「動作する」と「アサート」する必要があります(テストに固有の追加の「アレンジ」ステップが必要な場合もあります)。

+0

うーん、私はどのように私は単体テストは本当に標準ではないと思いますか?私はそれを "NUnit meets BDD"と考え、それは私のために働く。これは私が最初に "問題"を抱えていて、単純なtry-catchで解決されました。私が探しているのは、try-catchよりも洗練されたソリューションです。 「行為」はSetUpにとどまっています:p。 – dvdvorle

+0

try-catchと一緒に行くと、より洗練されたソリューション(そしてあなたの唯一のオプション)です。 – Simone

関連する問題