MVCContrib.FluentController CheckValidCall(action) のアクションによってスローされた例外を渡すにはどうすればよいですか?
[ExportModelStateToTempData]
public ActionResult Index(int itemId, int page)
{
return CheckValidCall(() => MyService.GetResults(itemId, page))
.Valid(x => View(x))
.Invalid(() => RedirectToAction(RestfulAction.Index));
}
GetResults() が例外をスローすると、それをビューに表示したいと思います。疲れた ModelState
<%if (ViewData.ModelState.ContainsKey("_FORM")) {%>
<div class="notificationError">
<%= ViewData.ModelState["_FORM"].Errors.FirstOrDefault().ErrorMessage %>
</div>
<%}%>
ただし、ModelState は有効であり、エラーは含まれていません。サービスメソッドを try-catch ブロックでラップせずに例外メッセージにアクセスする方法はありますか? ここで役立つ場合は、TestController.ModelState.IsValid が true であるため失敗する ModelState をチェックする単体テストです。
[Fact]
public void ServiceExceptionIsConvertedToModelStateErrorInFluentController()
{
// Set up
MockService.Setup(x => x.GetResults(It.IsAny<int>(), It.IsAny<int>()))
.Throws(new InvalidOperationException("Mocked Service Exception"));
// Excercise
Assert.Throws<InvalidOperationException>(() => TestController.GetResults(1, 1));
// Verify
Assert.False(TestController.ModelState.IsValid);
Assert.True(TestController.ModelState["_FORM"].Errors.Count > 0);
}