首页 | 互联网 | 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

        Index view在Listing 3中。注意文件名是Index.htm。SimpleViewEngine 返回了一个.htm 文件。

        Listing 3 – Index.htm

         <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml" >
        <head>
            <title>Tip 25</title>
        </head>
        <body>
            Here is the first message:
            {message}
            <br />
            Here is the second message:
            <b>{message2}</b>
        </body>
        </html>

        Index view包含也以前后大括号为标记的标签。SimpleViewEngine.RenderView()方法用View Data中的项目来替换每个同名标签。当Index view被SimpleViewEngine呈现时,你得到了Figure 1中的页面。

        Figure 1 - Index view呈现的页面

        创建一个伪造的Controller Context

        SimpleViewEngine.RenderView()方法并不返回一个值。RenderView()方法将值直接写入HttpContext.Response对象中。因此,为了单元测试views,我们必须能够伪造HttpContext 对象,以便我们能够暗中监视添加到该对象中的值。

        在我以前的两篇帖子中,我演示了如何伪造ControllerContext 和HttpContext 对象:

         http://weblogs.asp.net/stephenwalther/archive/2008/06/30/asp-net-mvc-tip-12-faking-the-controller-context.aspx
        http://weblogs.asp.net/stephenwalther/archive/2008/07/02/asp-net-mvc-tip-13-unit-test-your-custom-routes.aspx

        在以前的这些帖子中,我演示了伪造ControllerContext 和 HttpContext对象是很有用的,当你需要单元测试Session State, Cookies, Form fields, 和 Route Tables时。

        本文结尾处下载的代码中包含一个MvcFakes项目。我已经添加了一个伪造的HttpResponse 对象到一批伪造对象中,你可以在单元测试中使用这些伪造对象。

        为View创建一个单元测试

        既然我们已经创建了一个自定义的View Engine和一批伪造对象,那么我们就可以单元测试view了。Listing 4中的测试类测试了HomeController.Index() action返回的Index view。

        Listing 4 – HomeControllerTest.cs (C#)

         namespace Tip25Tests.Controllers
        {
            [TestClass]
            public class HomeControllerTest
            {
                private const string viewsPath =
                    @"C:\Users\swalther\Documents\Common Content\Blog\Tip25 Custom View Engine\CS\Tip25\Tip25\Views";
                [TestMethod]
                public void Index()
                {
                    // Setup controller
                    HomeController controller = new HomeController();
                    controller.ViewEngine = new SimpleViewEngine(viewsPath);
                    // Setup fake controller context
                    var routeData = new RouteData();
                    routeData.Values.Add("controller", "home");
                    var fakeContext = new FakeControllerContext(controller, routeData);
                    // Execute
                    ViewResult result = controller.Index() as ViewResult;
                    result.ExecuteResult(fakeContext);
                    string page = fakeContext.HttpContext.Response.ToString();
                    // Verify
                    StringAssert.Contains(page, "<title>Tip 25</title>");
                    StringAssert.Contains(page, "Welcome to ASP.NET MVC!", "Missing Message");
                    StringAssert.Contains(page, "<b>Using a custom View Engine</b>", "Missing Message2 with bold");
                }
            }
        }

        Listing 4中的测试代码包含4个部分。第一部分通过将我们自定义的SimpleViewEngine 和HomeController 类联系起来,进行准备HomeController。注意你必须给SimpleViewEngine的构造函数提供一个硬编码的 view目录的路径。(下载本文的代码后,你需要修改这个路径)

        第二部分准备伪造的ControllerContext 对象。注意你必须传递一个controller name 给FakeHttpContext 类的构造函数。

        接着,HomeController.Index() action方法被调用。这个action 返回一个ViewResult。接着,该ViewResult 在伪造的HttpContext中被执行。最后,HttpResponse.ToString() 方法被调用来获得SimpleViewEngine写入HttpResponse 对象的值。

        最后一部分证实view 呈现的页面包含三个子字符串。第一个是HTML 页面的title 被证实。第二,证实存在来自ViewData 的两个messages。注意该测试要证实第2个message 是否是粗体显示。

        总结

        在这篇帖子中,我展示了如何扩展你的单元测试来覆盖views。通过利用自定义的View Engine,你可以为models, controllers, 和 views创建单元测试。

上一页  [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频道相关导航