0

MVC4 Web アプリケーションを作成しています。通常、ユーザーに ActionResult を返すすべてのコントローラー メソッド内に「try{}catch{}」ブロックを配置するようにしています。すべての例外をキャッチして適切なメッセージを表示するためにこれを行うので、ユーザーには次のようなものは表示されません。

「参照がオブジェクトのインスタンスに設定されていません」

私のコントローラーは通常次のようになります。

try
{

}
catch(MyFirstCustomException ex)
{
//set some message for the user and do some cleaning etc.

return ActionResult();
}
catch(MySecondCustomException ex) (and so on...)
{
//set some message for the user and do some cleaning etc.

return ActionResult();
}
catch(Exception ex)
{
//set some message for the user and do some cleaning etc.

return ActionResult();
}

ただし、次のような状況になりました: AccountControllerLogInメソッドがあり、(Microsoft Unit Testing Framework を使用して) 単体テストを作成したいのですが、アカウントをアクティブ化していないユーザーは、ログインします。そのような試みが検出されたときにスローされるUserNotActivatedExceptionという名前の特別な例外があります。問題は、コントローラー内ですべての例外をキャッチするため、テストで実際にこの例外自体が表示されることはなく、テストが常に失敗することです。次のようなモデルの特別なステータス列挙型を作成することで、問題を回避することができました。

public enum LoginViewModelStatus
{
NotLoggedIn = 0,
LoginSuccessfull = 1,
LoginFailed = 2,
UserNotActivatedException = 3,
UnknownErrorException = 100
}

そして、何かが起こっているときに特定の値に設定することによって(そのため、特別な UserNotActivatedException をキャッチすると、 loginModelStatus を UserNotActivatedExceptionに設定するなど)

私の質問:

  1. これに代わるより良い方法はありますか?
  2. このデザインを他のコントローラーでも使用することを考えていますが、何か欠点はありますか?
  3. ユーザーにメッセージを表示するために多くのカスタム例外を使用するのは良い設計ですか?それとも、より多くのミニ if(someCondition){return false;} テストを使用する方がよいでしょうか?
4

3 に答える 3

0

コードが「安定しすぎている」ようです。つまり、ロジックがエラーを生成することはありません。安定性の観点からは優れていますが、あまりテストできません。

この場合、ActionResult を返してロジックを分離する前に、そのクラスから生成されたすべての例外をキャッチするカスタム ロジックを処理するクラスを用意します。

class ActionClass
{
    public bool HandleLogin(...)
    {
        ...
    }
}

次のようにクラスを使用します。

try
{
    ActionClass action = new ActionClass();
    action.HandleLogin(...)

}
// Catchblock here

これにより、ロジックをテストできます。

于 2013-10-28T07:45:07.047 に答える