0

Comment puis-je transmettre l'exception thorwn par l'action dans MVCContrib.FluentController CheckValidCall (action)?Comment afficher les exceptions d'appel non valides du contrôleur courant dans MVCContrib?

[ExportModelStateToTempData] 
    public ActionResult Index(int itemId, int page) 
    { 
     return CheckValidCall(() => MyService.GetResults(itemId, page)) 
      .Valid(x => View(x)) 
      .Invalid(() => RedirectToAction(RestfulAction.Index)); 
    } 

Lorsque GetResults() throws Exception je veux afficher dans la vue. J'ai fatigué ModelState

<%if (ViewData.ModelState.ContainsKey("_FORM")) {%> 
    <div class="notificationError"> 
     <%= ViewData.ModelState["_FORM"].Errors.FirstOrDefault().ErrorMessage %>    
    </div> 
<%}%> 

mais le ModelState est valide et ne contient aucune erreur. Existe-t-il un moyen d'accéder au message d'exception sans la méthode de service d'encapsulation dans le bloc try-catch? Si elle aide voici mon test unitaire pour vérifier ModelState qui échoue TestController.ModelState.IsValid est vrai:

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

Répondre

0

J'ai réussi à passer exception dans ModelState en remplaçant MvcContrib.FluentController.AbsteactFluentController.ExecuteCheckValidCall (l'action Func):

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

Appelée par CheckValidCall. Cependant, la méthode est décrite comme "publique à des fins de test uniquement et ne doit pas être utilisée". La méthode alternative consiste à remplacer MvcContrib.FluentController.AbstractFluentController.CheckValidCall().

Questions connexes