2012-09-19 38 views
15

Tôi đang thử đơn vị kiểm tra việc chuyển hướng bộ điều khiển của tôi trong MVC 4 .Net 4.5. Dưới đây là một ví dụ:Kiểm tra đơn vị MVC 4 RedirectToAction

[TestMethod] 
    public void Register_PassValidModel_RedirectToHomeIndexShouldBeTrue() 
    { 
     //Arrange 
     var registerModel = new RegisterModel 
     { 
      Email = "[email protected]", 
      Password = "password" 
     }; 

     //Assign 
     var result = _controller.Register(registerModel) as RedirectToRouteResult; 

     //Assert 
     result.RouteValues["Action"].ShouldBeEqual("Index"); 
     result.RouteValues["Controller"].ShouldBeEqual("Home"); 
    } 

đây là bộ điều khiển:

[HttpPost] 
    public ActionResult Register(RegisterModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var userToRegister = new User { Email = model.Email, Password = model.Password }; 
      var service = new UserService(_userRepository); 

      User user = service.RegisterUser(userToRegister); 

      if (user.UserErrorMessages.Count != 0) 
      { 
       user.UserErrorMessages.ForEach(x => ModelState.AddModelError("", x)); 
       return View(model); 
      } 

      SetCookie(model.Email); 

      return RedirectToAction("Index", "Home"); 
     } 
     return View(model); 
    } 

Vấn đề biến result trong thử nghiệm đơn vị là null. Tôi tìm thấy mã này từ một người đang làm việc trên một dự án MVC 2 và nó dường như làm việc cho anh ta. Có gì thay đổi với MVC 4?

Cảm ơn trước!

+0

Bạn có chắc chắn hành động thực sự trả về RedirectToAction ("Index", "Home")? Nên có một số logic trong hành động Đăng ký. Nếu nó trả về bất kỳ loại kết quả khác và bạn đang cố gắng để làm cho nó như RedirectToRouteResult hơn bạn sẽ nhận được null. – Felix

+0

Tôi nhận được đối tượng RedirectToRouteResult khi tôi thử. Bạn có chắc chắn bộ điều khiển của bạn trông giống như vậy? – Rickard

+0

Tôi đoán bạn có thể nhận được một ViewResult – VJAI

Trả lời

22

Hãy thử một niềm hy vọng này nó sẽ hữu ích cho bạn

var result= (RedirectToRouteResult)controller.Register(registrModel); 

      result.RouteValues["action"].Equals("Index"); 
      result.RouteValues["controller"].Equals("Home"); 

      Assert.AreEqual("Index", action.RouteValues["action"]); 
      Assert.AreEqual("Home", action.RouteValues["controller"]); 
+1

Điều này sẽ được đánh dấu là câu trả lời đúng. Ngoài ra, bản sao của http://stackoverflow.com/questions/7601972/what-is-the-best-way-to-test-a-redirecttoaction – GetFuzzy