2010-04-19 1 views
1

UrlHelper의 확장 메소드가 작동하는지 확인하기 위해 유닛 테스트를 만들려고합니까? 누구든지이 작업을 수행하는 방법을 알고 있습니까? MVC 1.0과 MvcContrib를 사용하고 있습니다. 나는 경로를 테스트 할 수 있지만 다음과 같은 코드를 테스트 할 수 없습니다하십시오 UrlHelper을 생성하기 위해유닛 테스트 UrlHelper 확장 메소드

public static string MoreFloorplans(this UrlHelper urlHelper, long productID, int pageIndex) 
    { 
    return urlHelper.Action<CatalogController>(x => x.GetRelatedProducts(productID, pageIndex)); 

    } 

답변

0

, 당신은 RequestContext이 필요합니다. 기능을 만들려면 RequestContextHttpContextBaseRouteData이 필요합니다. 두 번째 인 RouteData은 직접 작성해야합니다. HttpContextBase, 모의해야합니다.

그 때문에 Scott H 's MvcMockHelpers을 살펴 보시기 바랍니다. 그 부분은 약간 오래된 것이지만이 특정 테스트에는 충분하다고 생각합니다. 실제로 필요한 것은 FakeHttpContext 메소드와 그 의존성입니다. 당신이 라이브러리를 데리러가는 경우에, 당신의 코드가 같은 것을 보일 것이다 : 나는 당신이하지만 내가 아는 한, MvcContrib TestHelper 프로젝트를 사용하려는 말을 알고

[TestMethod] 
public void Can_write_more_floorplans() 
{ 
    const long productID = 12345; 
    const int pageIndex = 10; 

    var httpContext = FakeHttpContext(); // From the MvcMockHelpers 
    var routeData = new RouteData(); 
    var requestContext = new RequestContext(httpContext, routeData); 
    var urlHelper = new UrlHelper(requestContext); 
    string floorplans = MoreFloorplans(urlHelper, productID, pageIndex); 
    Assert.AreEqual(some_string, floorplans); 
} 

을, 해당 라이브러리는 모든 테스트에 관한 것입니다 컨트롤러. 낮은 수준의 구성 요소를 테스트 할만큼 충분히 세분화 된 것인지 확실하지 않습니다. 당신은 어쨌든 거기에 모든 것을 정말로 필요로하지 않습니다. 필요한 것은 RequestContext입니다.

+0

감사합니다. – fregas

4

나는 Aaronaught와 Scott H의 지시를 따랐지만 약간의 장난이 들었다. 나는 이런 식으로 끝났다. 그래서 RequestContext에서으로 RouteData을 설정하는 당신이 자신을 UrlHelper하지, 확장 방법을 테스트해야

public UrlHelper GetUrlHelper(
     string fileName = "/", 
     string url="http://localhost", 
     string queryString="") 
{ 
    // Use routes from actual app 
    var routeCollection = new RouteCollection(); 
    MvcApplication.RegisterRoutes(routeCollection); 

    //Make a request context 
    var request = new HttpRequest(fileName, url, queryString); 
    var response = new HttpResponse(new StringWriter()); 
    var httpContext = new HttpContext(request, response); 
    var httpContextBase = new HttpContextWrapper(httpContext); 
    var requestContext = new RequestContext(httpContextBase, new RouteData()); 

    // Make the UrlHelper with empty route data 
    return new UrlHelper(requestContext, routeCollection); 
} 

public void MoreFloorplans_ReturnsExpectedUrl() 
{ 
    var urlHelper = GetUrlHelper(); 
    var actualResult = urlHelper.MoreFloorPlans(1,2); 
    Assert.AreEqual("/MoreFloorPlans/1/2", actualResult); 
} 

주, 아마 범위를 벗어납니다.