Как отобразить недопустимые исключения вызовов из беглого контроллера в MVCContrib? - PullRequest
0 голосов
/ 05 мая 2010

Как я могу передать исключение, вызванное действием в 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? Если это поможет, вот мой модульный тест для проверки ModelState, который завершается с ошибкой, так как TestController.ModelState.IsValid имеет значение true:

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

1 Ответ

0 голосов
/ 06 мая 2010

Мне удалось передать исключение в ModelState путем переопределения MvcContrib.FluentController.AbsteactFluentController.ExecuteCheckValidCall (действие Func):

    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 ().

...