2016-04-23 24 views
2

Ich habe die folgende Klasse, wo ein Benutzer auf einen Controller AT/1/2 zugreifen kann, was Projekt 1, Schritt 2 bedeutet. Wenn der Benutzer ein Projekt und keinen Schritt (zweite Methode/Route) eingibt, sollte Schritt 99 verwendet werden. Wenn der Benutzer fehlschlägt um irgendetwas einzugeben, sollte es Projekt 1, Schritt 99 verwenden. Ich kann das leicht beheben, indem ich die überladene Methode manuell aufruft, aber ich dachte, ich sollte dasselbe mit RedirectToAction erreichen können. Bei den zweiten und dritten Methoden ist jedoch v in meinen Komponententests null.Warum gibt RedirectToAction null zurück?

Mein RegisterRoutes wie folgt aussieht:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapMvcAttributeRoutes(); //MVC 5 Attribute Routes 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{id}", 
     defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    ); 
} 

Ich bin nicht sicher, was ich hier fehlt.

public class ATController : Controller 
{ 
    [AllowAnonymous] 
    [Route("{project}/{step}")] 
    public ActionResult Index(int project, int step) 
    { 
     var m = new ATViewModel(); 
     m.Project = project; 
     m.Step = step; 
     return View(m); 
    } 

    [AllowAnonymous] 
    [Route("{project}")] 
    public ActionResult Index(int project) 
    { 
     var v = RedirectToAction("Index", new { project, step = 99 }); 
     return v; 
    } 

    [AllowAnonymous] 
    public ActionResult Index() 
    { 
     var v = RedirectToAction("Index", new { project = 1, step = 99 }); 
     return v; 
    } 
} 
+0

Können Sie die Komponententests anzeigen. – Nkosi

Antwort

0

Referenzierung Attribute Routing in ASP.NET MVC 5 gab es einige kleinere Updates auf dem Controller benötigt

[RoutePrefix("at")] 
public class ATController : Controller 
{ 
    //GET /at/1/2 
    [AllowAnonymous] 
    [Route("{project}/{step}")] 
    public ActionResult Index(int project, int step) 
    { 
     var m = new ATViewModel(); 
     m.Project = project; 
     m.Step = step; 
     return View(m); 
    } 

    //GET /at/1 
    [AllowAnonymous] 
    [Route("{project}")] 
    public ActionResult Index(int project) 
    { 
     var v = RedirectToAction("Index", new { project = project, step = 99 }); 
     return v; 
    } 

    //GET /at 
    [AllowAnonymous] 
    [Route("")] 
    public ActionResult Index() 
    { 
     var v = RedirectToAction("Index", new { project = 1, step = 99 }); 
     return v; 
    } 
} 

Hier sind auch einige Unit-Tests für die Steuerung, die alle Pass (GRÜN), wenn getestet.

[TestClass] 
public class MvcControllerAttributeRouteTests : ControllerUnitTests { 
    [TestMethod] 
    public void Index_Should_Return_ViewResult_With_Model() { 
     //Arrange 
     int project = 1; 
     int step = 2; 
     var controller = new ATController(); 
     //Act 
     var actionResult = controller.Index(project, step); 
     var viewResult = actionResult as ViewResult; 
     //Assert 
     Assert.IsNotNull(viewResult); 
     Assert.IsNotNull(viewResult.Model); 
     Assert.IsInstanceOfType(viewResult.Model, typeof(ATViewModel)); 
     var viewModel = viewResult.Model as ATViewModel; 
     Assert.AreEqual(project, viewModel.Project); 
     Assert.AreEqual(step, viewModel.Step); 
    } 

    [TestMethod] 
    public void Project_Supplied_No_Step_Should_Redirect_To_Index() { 
     //Arrange 
     int project = 1; 
     var controller = new ATController(); 
     //Act 
     var actionResult = controller.Index(project); 
     var result = actionResult as RedirectToRouteResult; 
     //Assert 
     Assert.IsNotNull(result); 
     Assert.AreEqual("Index", result.RouteValues["action"], "the redirection was to at.index action"); 
     Assert.AreEqual(project, result.RouteValues["project"]); 
    } 

    [TestMethod] 
    public void No_Porject_No_Step_Should_Redirect_To_Index() { 
     //Arrange 
     var controller = new ATController(); 
     //Act 
     var actionResult = controller.Index(); 
     var result = actionResult as RedirectToRouteResult; 
     //Assert 
     Assert.IsNotNull(result); 
     Assert.AreEqual("Index", result.RouteValues["action"], "the redirection was to at.index action"); 
     CollectionAssert.Contains(result.RouteValues.Keys, "project"); 
     CollectionAssert.Contains(result.RouteValues.Keys, "step"); 
    } 
} 
Verwandte Themen