gpt4 book ai didi

asp.net-mvc - 使用 View.Render 方法将 MVC View 转换为字符串的单元测试方法

转载 作者:行者123 更新时间:2023-12-04 12:54:53 28 4
gpt4 key购买 nike

我已经编写了将 MVC View 转换为字符串的方法和测试方法来检查它是否返回字符串。

当然,它适用于 Web,但是当我在 NUnit 中运行测试时,当方法尝试调用 View.Render 时,它会在 System.Web 中抛出 NullReferenceException。

这是堆栈跟踪:

   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;
}

以及带有 Controller 上下文模拟的测试方法:
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);

我读了 HERE原因是 _virtualPathHttpRuntime.AppDomainAppVirtualPathString int System.Web.VirtualPathString是 NULL。

那么是否可以将它们设置为单元测试?

最佳答案

您是否尝试过实现自己的 VirtualPathProvider?

像这样的东西:

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);
}


}

然后在 Global.asax
///register our custom virtual path provider factory.
HostingEnvironment.RegisterVirtualPathProvider(new CustomVirtualPathProvider());

使用这种方法,您可以从任何地方渲染 View 。

关于asp.net-mvc - 使用 View.Render 方法将 MVC View 转换为字符串的单元测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17170889/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com