4

コントローラー アクションの一部を次に示します。

[HttpPost]
public ActionResult NewComplaint(Complaint complaint)
{
    if(!ModelState.IsValid)
    {
        // some code
    }
    // some more code...
}

アプリケーションを実行すると、if ステートメントが呼び出される前にモデルが自動的に検証されます。ただし、このコードを単体テストしようとすると、自動検証は行われません。

FormCollection を使用して代わりに TryUpdateModel を呼び出すと、検証が行われますが、それは使用したくありません。

if ステートメントの前に TryValidateModel(model) を呼び出すと、問題がうまく回避されることがわかりました。コードを 1 行追加するだけです。しかし、私はむしろそれを取り除きたいと思います。

単体テストでは自動検証が行われず、アプリケーションの実行中に行われる理由はありますか?

編集: 言及するのを忘れて、私は ASP.NET MVC3 RC1 を使用しています。違いがあれば、コントローラーの HTTPContext オブジェクトをモックしています。

4

1 に答える 1

4

検証はモデルのバインド中に行われます(そしてTryUpdateModelはモデルのバインドを実行します)。

しかし、問題は、テストしようとしているのがMVCフレームワーク(つまり、アクションメソッドが呼び出される前に検証が行われるという事実)であるということだと思います。あなたはそれをテストするべきではありません。

その部分は(広範囲にテストしているため)正常に機能し、アプリケーションコードのみをテストすると想定する必要があります。したがって、この場合、モックする必要があるのはの戻り値だけでModelState.IsValidあり、検証エラーを手動で追加することでそれを行うことができます。

ModelState.AddModelError("some key", "some error message")
于 2010-12-09T19:55:55.803 に答える