2013-06-18 3 views
6

MVC 뷰를 문자열로 변환하고 테스트 메서드를 사용하여 문자열을 반환하는지 확인하는 메서드를 작성했습니다.view.render 메서드를 사용하여 MVC 뷰를 문자열로 변환하는 단위 테스트 메서드

물론 웹에서도 작동하지만 NUnit에서 테스트를 실행하면 메서드가 View.Render를 호출 할 때 System.Web에 NullReferenceException이 throw됩니다.

w System.Web.VirtualPath.GetCacheKey() 
    w System.Web.Compilation.BuildManager.GetCacheKeyFromVirtualPath(VirtualPath virtualPath, Boolean& keyFromVPP) 
    w System.Web.Compilation.BuildManager.GetVPathBuildResultFromCacheInternal(VirtualPath virtualPath, Boolean ensureIsUpToDate) 
    w System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) 
    w System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) 
    w System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) 
    w System.Web.Compilation.BuildManager.GetObjectFactory(String virtualPath, Boolean throwIfNotFound) 
    w System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.FileExists(String virtualPath) 
    w System.Web.Mvc.BuildManagerViewEngine.FileExists(ControllerContext controllerContext, String virtualPath) 
    w System.Web.Mvc.VirtualPathProviderViewEngine.GetPathFromSpecificName(ControllerContext controllerContext, String name, String cacheKey, String[]& searchedLocations) 
    w System.Web.Mvc.VirtualPathProviderViewEngine.GetPath(ControllerContext controllerContext, String[] locations, String[] areaLocations, String locationsPropertyName, String name, String controllerName, String cacheKeyPrefix, Boolean useCache, String[]& searchedLocations) 
    w System.Web.Mvc.VirtualPathProviderViewEngine.FindView(ControllerContext controllerContext, String viewName, String masterName, Boolean useCache) 
    w System.Web.Mvc.ViewEngineCollection.<>c__DisplayClassc.<FindView>b__b(IViewEngine e) 
    w System.Web.Mvc.ViewEngineCollection.Find(Func`2 lookup, Boolean trackSearchedPaths) 
    w System.Web.Mvc.ViewEngineCollection.Find(Func`2 cacheLocator, Func`2 locator) 
    w System.Web.Mvc.ViewEngineCollection.FindView(ControllerContext controllerContext, String viewName, String masterName) 
    w MvcApplication.Infrastructure.Services.MailingService.RenderEmailBody[T](String viewPath, T model, ControllerContext controllerContext, Boolean isParialView) w d:\MyProjects\CertyfikatyNoble\branches\Certyfikaty3\MvcApplication\Infrastructure\Services\MailingService.cs:wiersz 175 
    w MvcApplication.Tests.MailingServiceTests.ViewToStrngTest() w d:\MyProjects\CertyfikatyNoble\branches\Certyfikaty3\MvcApplication.Tests\MailingServiceTests.cs:wiersz 144 

렌더링 방법 코드 : 모의 컨트롤러 컨텍스트

public string RenderEmailBody<T>(string viewPath, T model, ControllerContext controllerContext, bool isParialView) 
{ 
    ViewEngineResult viewEngineResult = null; 
    if (isParialView == true) 
    { 
     viewEngineResult = ViewEngines.Engines.FindPartialView(controllerContext, viewPath); 
    } 
    else 
    { 
     viewEngineResult = ViewEngines.Engines.FindView(controllerContext, viewPath, null); 
    } 

    if (viewEngineResult == null) 
    { 
     throw new FileNotFoundException("Coukld not find view."); 
    } 

    var view = viewEngineResult.View; 
    controllerContext.Controller.ViewData.Model = model; 

    string result = null; 

    using (var sw = new StringWriter()) 
    { 
     var ctx = new ViewContext(controllerContext, view, 
            controllerContext.Controller.ViewData, 
            controllerContext.Controller.TempData, 
            sw); 
     view.Render(ctx, sw); 
     result = sw.ToString(); 
    } 

    return result; 
} 

및 시험 방법 I은 원인이 _virtualPath 것을 HERE 읽어

 Mock<HttpBrowserCapabilitiesBase> browserMock = new Mock<HttpBrowserCapabilitiesBase>(); 
     browserMock.Setup(m => m.IsMobileDevice).Returns(false); 

     Mock<HttpServerUtilityBase> httpServerUtilityBaseMock = new Mock<HttpServerUtilityBase>(MockBehavior.Strict); 

     Mock<HttpResponseBase> httpResponseMock = new Mock<HttpResponseBase>(MockBehavior.Strict); 
     httpResponseMock.Setup(m => m.Cookies).Returns(new HttpCookieCollection() { new HttpCookie("ResponseCookieTest") }); 

     Mock<HttpRequestBase> httpRequestMock = new Mock<HttpRequestBase>(MockBehavior.Strict); 
     httpRequestMock.Setup(m => m.UserHostAddress).Returns("127.0.0.1"); 
     httpRequestMock.Setup(m => m.Cookies).Returns(new HttpCookieCollection() { new HttpCookie("RequestCookieTest") }); 
     httpRequestMock.Setup(m => m.UserAgent).Returns("None"); 
     httpRequestMock.Setup(m => m.Browser).Returns(browserMock.Object); 
     httpRequestMock.Setup(m => m.ApplicationPath).Returns("/"); 
     httpRequestMock.Setup(m => m.AppRelativeCurrentExecutionFilePath).Returns("/"); 
     httpRequestMock.Setup(m => m.PathInfo).Returns(string.Empty); 
     httpRequestMock.Setup(m => m.Form).Returns(new NameValueCollection()); 
     httpRequestMock.Setup(m => m.QueryString).Returns(new NameValueCollection()); 

     Mock<HttpSessionStateBase> httpSessionStateMock = new Mock<HttpSessionStateBase>(MockBehavior.Strict); 
     httpSessionStateMock.Setup(m => m.SessionID).Returns(Guid.NewGuid().ToString()); 


     Mock<HttpContextBase> HttpContextMock = new Mock<HttpContextBase>(MockBehavior.Strict); 
     HttpContextMock.Setup(m => m.Request).Returns(httpRequestMock.Object); 
     HttpContextMock.Setup(m => m.Response).Returns(httpResponseMock.Object); 
     HttpContextMock.Setup(m => m.Server).Returns(httpServerUtilityBaseMock.Object); 
     HttpContextMock.Setup(m => m.Session).Returns(httpSessionStateMock.Object); 

     HttpContextMock.Setup(m => m.Items).Returns(new ListDictionary()); 

     RouteData routeData = new RouteData(); 
     routeData.Values.Add("controller", "someController"); 
     routeData.Values.Add("action", "index"); 

     Mock<ControllerContext> controllerContextMock = new Mock<ControllerContext>(MockBehavior.Strict); 
     controllerContextMock.Setup(m => m.HttpContext).Returns(HttpContextMock.Object); 
     controllerContextMock.Setup(m => m.RouteData).Returns(routeData); 
     controllerContextMock.Setup(m => m.Controller).Returns(new AccountController()); 

     SiteConfigurationService siteConfigurationService = SiteConfigurationService.Instance(); 
     siteConfigurationService.LoadConfig<SiteConfigurations>(this._siteConfigurationsRepository.GetDefaultConfig()); 

     MailingService service = new MailingService(controllerContextMock.Object, siteConfigurationService); 

     string result = service.RenderEmailBody<object>("/ViewToRenderToString.cshtml", new object(), controllerContextMock.Object, false); 

여기

는 스택 트레이스이고 및 HttpRuntime.AppDomainAppVirtualPathString int System.Web.VirtualP athString이 NULL입니다.

단위 테스트 용으로 설정할 수 있습니까?

미리 감사드립니다.

+0

나는 이것을 이전의 경우에 아주 광범위하게 들여다 보았고 어렵다. 대신 할 수있는 일은 평소와 같이 이메일 본문을 렌더링하고 WebRequest 등을 사용하여 읽는 것입니다. 그런 다음 어떻게 렌더링되는지 보려면 통합 테스트를 수행하십시오. – JuhaKangas

+0

webrequest에 의지하지 않고이 작업을 수행하려고 할 때 수행 한 작업 : allow .net 프레임 워크 스테핑을 켜고 mvc 소스 코드를 다운로드하고 직접 오류가있는 어셈블리를 디 컴파일하십시오. 나는 그것을 성취했다고 생각하지 않지만 나는 대답에 매우 흥미가있다. – Maslow

답변

0

VirtualPathProvider를 구현해 보셨습니까? 이 같은

뭔가 :이 방법으로

///register our custom virtual path provider factory. 
      HostingEnvironment.RegisterVirtualPathProvider(new CustomVirtualPathProvider()); 

Global.asax에

에서 다음

public class CustomVirtualPathProvider : VirtualPathProvider 
    { 
     internal class CustomVirtualFile : ViewVirtualFile 
     { 
      public override bool IsDirectory 
      { 
       get 
       { 
        return base.IsDirectory; 
       } 
      } 
      public override string Name 
      { 
       get 
       { 
        return base.Name; 
       } 
      } 
      public override string ResourceKey 
      { 
       get 
       { 
        return base.ResourceKey; 
       } 
      } 
      public override System.IO.Stream Open() 
      { 
       return base.Open(); 
      } 
      public CustomVirtualFile(string path) 
       : base(path) 
      { 

      } 

     } 
     public override bool FileExists(string virtualPath) 
     { 
      return base.FileExists(virtualPath); 
     } 
     public override VirtualFile GetFile(string virtualPath) 
     { 
      return base.GetFile(virtualPath); 
     } 
     public override VirtualDirectory GetDirectory(string virtualDir) 
     { 
      return base.GetDirectory(virtualDir); 
     } 
     public override bool DirectoryExists(string virtualDir) 
     { 
      return base.DirectoryExists(virtualDir); 
     } 


    } 

, 당신은 어디에서 뷰를 렌더링 할 수 있습니다.

관련 문제