2012-07-15 6 views
13

단위 테스트에서 컨트롤러 작업이 실제로 특정 페이지로 리디렉션되는지 확인하는 간단한 방법이 있습니까?asp.net MVC 단위 테스트 리디렉션

컨트롤러 코드 :

public ActionResult Create(ProductModel newProduct) 
{ 
    this.repository.CreateProduct(newProduct); 
    return RedirectToAction("Index"); 
} 

그래서 내 테스트에서, 나는 컨트롤러가 실제로 리디렉션되어 있는지 확인해야합니다.

ProductController controller = new ProductController(repository); 

RedirectToRouteResult result = (RedirectToRouteResult)controller.Create(newProduct); 

bool redirected = checkGoesHere; 
Assert.True(redirected, "Should have redirected to 'Index'"); 

나는 검증 방법을 모르겠습니다. 어떤 아이디어?

답변

25

물론 :

Assert.AreEqual("Index", result.RouteValues["action"]); 
Assert.IsNull(result.RouteValues["controller"]); // means we redirected to the same controller 

당신이 훨씬 더 우아한 방법이 단위 테스트 (당신은 심지어 RedirectToRouteResult에 캐스트 할 필요가 없습니다) 쓸 수 MvcContrib.TestHelper를 사용하여 :

// arrange 
var sut = new ProductController(repository); 

// act 
var result = sut.Create(newProduct); 

// assert 
result 
    .AssertActionRedirect() 
    .ToAction("Index"); 
+0

감사 대린을 ...

var result = sut.Create(newProduct) as RedirectToRouteResult; Assert.Equal(result.RouteValues["action"], "Index"); Assert.Equal(result.RouteValues["Parameter Name"], "Parameter Value"); 

희망 같은 것을 할 수 있습니다. –

+0

+1에 대한 링크는 TestHelper –

+0

이 MvcContrib 라이브러리는 환상적입니다! – will

11

시도를 이 ...

var result = sut.Create(newProduct) as RedirectToRouteResult; 
Assert.Equal(result.RouteValues["action"], "Index"); 

그리고 리디렉션 요일에 매개 변수를 전달하는 경우 나는이 같은 간단한 일이 될 줄 알았습니다 - u는이 도움이 :)