2011-07-29 10 views
0

は、私は次のようにMVCのアクションを持っていると言う:不正アクセスの試みのケースをテストするにはユニットテストとSRP(試験方法スコープ/団体)

public ActionResult CustomerRecord(customerId) 
{ 
    if (_currentUser.CanViewCustomer(customerId)) 
     return View(); 

    else 
    { 
     // user has tried to access an unauthorised record, 
     // should not be here! 
     _logger.Log(new SecurityException()); 
     return View("UnauthorizedAccess"); 
    } 
} 

、どのように多くのテスト方法があるはず?

CustomerRecord_WithUnauthorizedUser_LogsExceptionAndReturnsUnauthorizedView 

または私は2つのテスト書くん:私は、問題は技術的には、コントローラは、SRPを違反していることだと思いますが、私にはない

CustomerRecord_WithUnauthorizedUser_LogsException 
CustomerRecord_WithUnauthorizedUser_ReturnsUnauthorizedView 

つまり私は、単一のテストを書くのですかそれを自分自身の問題として見てください(あなたが同意しないなら、私を修正してください)。私はそれがどのようにテストメソッドにマップされているのか分かりません。メソッドの責任ごとに1つのテスト、またはメソッドを介して1つのルートごとに1つのテスト?

答えて

2

あなたのコントローラは、必ずしも2つのものを行うことでSRPを違反していない - それはまだ一つだけ責任(制御)を持っています。この具体例では

、私は、ログ呼び出しが行われると主張を警戒だろう - あなたが、ログ文を取る場合は、アプリケーションの機能に影響を与えることはないだろう。ユニットテストを過度に指定すると、それらが脆くなり、維持する苦痛があります。これは私がBDDを好きにしている理由の一部です。

あなたは監査すべての失敗した試行を持っていた場合、私はそれが価値があるユニットテストですので、それはあなたが読んで、次に何をやっているかどう推測:一般的に

を、あなただけ(多分あなたの1つのアサーションを持っている必要があります単体テストごとにアサルトメソッドを呼び出す必要があります)。基本的に、失敗したテストの名前を見て、コードを見なくても何が間違っているのかを知ることができてうれしいです。それは問題がある場合は失敗したコードパスのどの部分即座に明らかだからだから私は(あなたがそれを置くとして、あるいは責任)私はテストごとにアサートを好む...

+0

「あなたのコントローラは、必ずしも二つのことを行うことでSRPを違反していない - それはまだ一つだけの責任(制御)持っている」 私は、これは責任の非常にあいまいな定義であると怖いし。あなたはコントロールの責任をどのように定義しますか? 5人のプログラマーにこの質問をしてもらえれば、5つの異なる答えを得ることができますか? Managerという名前のクラスと同じです。 –

2

を2つのテストを持っ提唱したいです。これは、テスト結果を読むときに分かりやすい方法でテストの名前を付けていることを前提としています。