2011-10-25 7 views
0

予期しない例外を模擬するか単体テストすることは可能ですか?コードカバレッジはキャッチがテストされていないと不平を言いますが、どのようにテストしますか?ユニットが予期しない例外をテストしていますか?

public List<Blog> SelectActiveBlogs() 
    { 
     List<Blog> returnCode = null; 

     try 
     { 
      returnCode = GetQueryable<Blog>().Where(b => b.IsActive).ToList(); 
     } 
     catch (Exception ex) 
     { 
      ExceptionHandler.HandleException(ex); 
     } 

     return returnCode; 
    } 

EDIT: GetQueryableはデシベル結果を取得するためのリポジトリファクトリを使用する方法であるため、生産にデシベル相互作用からバブルアップ例外があるかもしれないので、私たちがあればそれらをキャッチ確認します何かが間違っているので、キャッチブロックが存在します。

EDIT2:実際に例外がスローされないと、スタックトレースを保存するためにカスタムクラスによって処理されます。この場合、私が模擬して例外を投げることができるかどうかについての質問は依然として残っています。

+0

1. 'GetQueryable'とは何ですか?あなたはそこに投げられない? 2.さらにスローするだけなら、これをテストよりも変更する方がいいでしょう。 – NOtherDev

+3

大きな質問:なぜあなたはそれを持っていますか?そのキャッチブロックは無意味です。 –

+0

例外を処理していない場合は、なぜキャッチブロックを取得したことがありますか?この例では、すべて削除する方がよいでしょう。 – Paolo

答えて

1

メソッドGetQueryable()をモックしないでください。ただし、クエリ可能なクラスを取得する必要があります。

私はあなたがGetQueryableで、このようないくつかのコードを(持っていると思います)

private IQueryable<T> GetQueryable<T>() 
{ 
    return repository.query... 
} 

だから、方法が、リポジトリインスタンスを模擬し、クエリが呼び出されるモックで例外をスローしないでください。

MOQを使用すると、複雑にすべきではないというモック - このテストは、大きなコードの品質以下のバグにつながる場合、私は疑問に思い

var mock = new Moq.Mock<IRepository<Blog>>(); 
mock.Setup(r => r.Query()).Throws(new Exception("I'm really unexpected")); 

のようなもの。しかし、上記の方法はカバレッジツールを喜ばせます;)

+0

カバレッジツールを喜ばせるためにはい。ありがとうございました! – keeg

1

私はあなたがそれをテストしないと思います。

以前にテストシステムでは実現できなかったケースのために、多くの例外ハンドラが残っています。

この特定のケースでは、とにかくナンセンスコードなので、try/catch/throwを削除するだけです。

1

ExpectedExceptionアトリビュートを使用して処理することはできません。引数に渡すパラメータのtypeofに依存します。

[TestMethod] 
[ExpectedException(typeof(Exception), 
"A exception has been throws.")] 
public List<Blog> SelectActiveBlogs() 
{ 
    List<Blog> returnCode = null; 

    try 
    { 
     returnCode = GetQueryable<Blog>().Where(b => b.IsActive).ToList(); 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 

    return returnCode; 
} 

もう1つのことは、この方法で実装すれば、try catchブロックが不要です。あなたが例外をキャッチし、それを(他の例外処理なしで)再スローするだけなら、それは意味をなさない。

希望があれば、コメントしてください。良い一日を!

+1

OPはそれをスローする方法を尋ねていませんでしたか? –

+0

私は彼が単体テストで期待されない例外を処理したいと思うと思います。多分ミスのこと。 @keeg:どんな考え? – dknaack

+0

そうですが、実際にその例外を投げることはできません。 – keeg

0

あなたがexceptionに取得したい場合は、コードのスローexceptionをしなければならないこと、コールGetQueryable<Blog>()を模擬し、NULLを返すことができます。あるいは、あなたはそのモックを実装する方法に依存して、その呼び出しを嘲笑するだけで例外をスローすることができます。 throw exを実行すると、そのコードでスタックトレースが失われます。

関連する問題