カスタム入力モデルを使用した ASP.NET Mvc コントローラーの単体テスト (xUnit)
-
26-09-2019 - |
質問
非常に単純なシナリオであると予想されるものについての情報を見つけるのに苦労しています。DataAnnotions を使用したカスタム入力モデルを利用する ASP.NET Mvc 2 コントローラーでアクションを単体テストしようとしています。タイトルで述べたように、私のテスト フレームワークは xUnit です。
これが私の習慣です 入力モデル:
public class EnterPasswordInputModel
{
[Required(ErrorMessage = "")]
public string Username { get; set; }
[Required(ErrorMessage = "Password is a required field.")]
public string Password { get; set; }
}
そして、これが私のものです コントローラ (この例では、簡略化するためにロジックをいくつか取り出しています):
[HttpPost]
public ActionResult EnterPassword(EnterPasswordInputModel enterPasswordInput)
{
if (!ModelState.IsValid)
return View();
// do some logic to validate input
// if valid - next View on successful validation
return View("NextViewName");
// else - add and display error on current view
return View();
}
そして、これが私のものです xユニットファクト (これも簡略化されています):
[Fact]
public void EnterPassword_WithValidInput_ReturnsNextView()
{
// Arrange
var controller = CreateLoginController(userService.Object);
// Act
var result = controller.EnterPassword(
new EnterPasswordInputModel
{
Username = username, Password = password
}) as ViewResult;
// Assert
Assert.Equal("NextViewName", result.ViewName);
}
テストを実行すると、コントローラーの結果 (Act セクション) を取得しようとすると、テスト ファクトで次のエラーが発生します。
System.NullReferenceException: Object reference not set to an instance of an object.
ご協力いただけると幸いです。
解決
とはいえ、解決に向かっていると思います。コントローラーに加えた変更は次のとおりです。
オリジナル
if (!ModelState.IsValid)
return View();
更新しました
if (!TryUpdateModel(loginInput))
return View();
私のテストではモデルのバインディングが発生していないようです。POST が発生しない限り、モデルのバインドは行われないようです。試行されたモデル バインディングを強制することで、テストに合格することができました。
注記:また、モデルが検証されなかった理由を理解しようとしていたときに、元の null 参照を引き起こすアクションのエラーもありました。
参照:http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html
他のヒント
あなたはあなたのコントローラのアクション内のヌルのインスタンスを参照解除しています。おそらくコードで、あなたは「簡素化」に質問を出しました。何を把握するために、テスト結果のコールスタックを見てください。あなたは、テストのための模擬何かに必要になることがあります。