0

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);
    }
4

1 に答える 1

0

MvcContrib.FluentController.AbsteactFluentController.ExecuteCheckValidCall(Func action)をオーバーライドすることで、ModelStateに例外を渡すことができました。

    protected override object ExecuteCheckValidCall(Func<object> action)
    {
        try
        {
            return base.ExecuteCheckValidCall(action);
        }
        catch (Exception exception)
        {
            ModelState.AddModelError("_Exception", exception);
            return null;
        }
    }

これはCheckValidCallによって呼び出されます。ただし、このメソッドは「テスト目的でのみ公開されており、使用しないでください」と説明されています。これを行う別の方法は、MvcContrib.FluentController.AbstractFluentController.CheckValidCall()をオーバーライドすることです。

于 2010-05-06T13:37:29.677 に答える