0

次のようなMVCアクションがあるとします。

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つのテストを書きますか?

CustomerRecord_WithUnauthorizedUser_LogsException
CustomerRecord_WithUnauthorizedUser_ReturnsUnauthorizedView

問題は、技術的にはコントローラーがSRPに違反していることだと思いますが、それ自体が問題であるとは考えていません(同意しない場合は修正してください)。それがテストメソッドにどのようにマッピングされるかはわかりません。メソッドの責任ごとに1つのテストですか、それともメソッドを通る単一のルートごとに1つのテストですか?

4

2 に答える 2

2

コントローラーは、必ずしも2つのことを行ってSRPに違反しているわけではありません。それでも、1つの責任(制御)しかありません。

この特定の例では、ログ呼び出しが行われたと主張しないように注意します。ログステートメントを削除しても、アプリケーションの機能に影響はありません。ユニットテストを過剰に指定すると、それらはもろくなり、維持するのが面倒になります。これが、私がBDDをとても気に入っている理由の1つです。

失敗したすべての試行を監査する必要がある場合は、単体テストの価値があると思います。そのため、それを実行している場合は、以下をお読みください。

一般に、単体テストごとに1つのアサーション(おそらく、1つまたは2つのアサーションメソッドを呼び出して1つのセマンティックアサーションを作成する必要があります)のみを使用する必要があります-基本的に、失敗したテストの名前を確認して、コードを見なくても、何が問題になっているのかを正確に知ることができます。だから私は2つのテストをすることを提唱します...

于 2011-07-29T11:30:19.023 に答える
2

問題が発生した場合にコードパスのどの部分が失敗したかが即座に明らかになるため、テストごとに1つのアサート(またはあなたが言う責任)を好みます。これは、テスト結果を読むときに理解できる方法でテストに名前を付けることを前提としています(例ではそうです)。

于 2011-07-29T11:32:34.147 に答える