首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> XMLWeb >> 正文

单元测试View不使用Web Server

        你的web application可以测试的部分越多,你就对应用程序的修改不会带来新的bug越有信心。ASP.NET MVC让你很容易测试models 和controllers。在这篇帖子中,我将解释如何单元测试views。

        创建一个自定义View Engine

        让我们从创建一个自定义的View Engine开始。Listing 1中包含了一个叫做SimpleViewEngine的非常简单的View Engine。

        Listing 1 – SimpleViewEngine.cs (C#)

         namespace Tip25
        {
            public class SimpleViewEngine : IViewEngine
            {
                private string _viewsFolder = null;
                public SimpleViewEngine()
                {
                    if (HttpContext.Current != null)
                    {
                        var root = HttpContext.Current.Request.PhysicalApplicationPath;
                        _viewsFolder = Path.Combine(root, "Views");
                    }
                }
                public SimpleViewEngine(string viewsFolderPhysicalPath)
                {
                    _viewsFolder = viewsFolderPhysicalPath;
                }
                public void RenderView(ViewContext viewContext)
                {
                    if (_viewsFolder == null)
                        throw new NullReferenceException("You must supply a viewsFolder path");
                    string fullPath = Path.Combine(_viewsFolder, viewContext.ViewName) + ".htm";
                    if (!File.Exists(fullPath))
                        throw new HttpException(404, "Page Not Found");
                    // Load file
                    string rawContents = File.ReadAllText(fullPath);
                    // Perform replacements
                    string parsedContents = Parse(rawContents, viewContext.ViewData);
                    // Write results to HttpContext
                    viewContext.HttpContext.Response.Write(parsedContents);
                }
                public string Parse(string contents, ViewDataDictionary viewData)
                {
                    return Regex.Replace(contents, @"\{(.+)\}", m => GetMatch(m, viewData));
                }
                protected virtual string GetMatch(Match m, ViewDataDictionary viewData)
                {
                    if (m.Success)
                    {
                        string key = m.Result("$1");
                        if (viewData.ContainsKey(key))
                            return viewData[key].ToString();
                    }
                    return String.Empty;
                }
            }
        }

        注意SimpleViewEngine 实现了IViewEngine 接口。该接口有一个RenderView()方法必须实现。

        在Listing 1中,RenderView()方法从硬盘中加载一个文件,并用ViewData中的项目来替换文件中的标签(tokens)。 在Listing 2中,包含了一个使用SimpleViewEngine的 controller 。当你调用HomeController.Index() action时,它返回一个叫做Index的view。

        Listing 2 – HomeController.cs (C#)

         namespace Tip25.Controllers
        {
            [HandleError]
            public class HomeController : Controller
            {
                public HomeController()
                {
                    this.ViewEngine = new SimpleViewEngine();
                }
                public ActionResult Index()
                {
                    ViewData["Message"] = "Welcome to ASP.NET MVC!";
                    ViewData["Message2"] = "Using a custom View Engine";
                    return View("Index");
                }
            }
        }

[1] [2] 下一页

【责编:michael】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·WEB程序开发--ASP.NET和PHP、JSP究竟学哪个?
 ·五步带你入门XML
 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航