如何使ASP.NET Webforms应用程序可测试?

时间:2012-02-21 15:58:00

标签: asp.net tdd nunit enterprise legacy

我正在研究使用ASP.NET编写的遗留企业应用程序。没有控件或Web表单。这是它的工作原理:

EmployeeList.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="EmployeeList.aspx.cs" Inherits="EmployeeList" %>

EmployeeList.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    // Security Check

    // Load Template, get version 1.4 of active employee list
    StringBuilder template = GetTemplate("Employee", "ActiveList", "1.4", true);

    // Get list from database
    using(SqlDataReader objReader = GetListFromDB()) 
    {
        while(objReader.Read()) 
        {
            //fills data
            TUtils.Replace(template, ROW, "%name%", objReader[0]);
        }
    }

    // return response
    Response.Write(template.ToString());
}

private StringBuilder GetTemplate(string x, string y, string v, bool z);
{
    // returns template
}

private SqlDataReader GetListFromDB() {
    // returns data reader
}

我的问题是,既然我们没有使用网络表单,有没有办法在这个事件驱动模型中引入NUnit(如上所示)?

此外,请避免建议转移到我们正在考虑的ASP.NET MVC或其他模式,但想知道是否有任何方法可以将此企业应用程序转换为可测试的。

2 个答案:

答案 0 :(得分:4)

这绝对是可能的。您应该了解如何使用ASP.NET Webforms实现MVP模式。有几个开源实现,但你可以自己做一个较小的专业。

基础知识是将您的代码置于逻辑之后转移到演示者类。演示者类具有对实现接口的页面的引用。你的案例中的诀窍是模拟你的测试的Page.Response对象。这就是为什么很难以正确的方式进行单元测试。 PageResponse属性包含一个派生自HttpResponseBase的对象,它是您应该在测试中进行模拟并使用您的示例执行断言的基类。您可以从那开始,然后使用Session,Request等功能扩展您的演示者。

如果你根本没有任何标记,你可以在视图构造函数中创建演示者,而不必费心去参考视图。

澄清一下:最大的诀窍是从aspx.cs文件中获取代码。那只野兽是不可测试的。

演示者的示例基类:

public class Presenter<T> where T : class, IView
    {
        protected readonly T View;

        protected Presenter(T view, ILogger logger)
        {
            View = view;
        }

        public virtual void page_PreRender(object sender, EventArgs e)
        {
        }

        public virtual void page_Init(object sender, EventArgs e)
        {
        }

        public virtual void page_Load(object sender, EventArgs eventArgs)
        {
        }

        public HttpContextBase HttpContext { protected get; set; }

        protected HttpRequestBase Request
        {
            get { return HttpContext.Request; }
        }
    }

答案 1 :(得分:0)

由于您的大部分代码都在代码隐藏中,我不认为使用NUnit / Visual Studio测试框架的常用测试方法可以正常运行。

但是,我认为一种可能的方法是使用像WATIN / Selenium这样的UI测试框架。这将使您仍然可以编写各种功能的测试。 我过去做过类似的事情,基本上为每个导致服务器回发的UI操作编写一个测试用例。可能不太理想,但它确实允许您自动化测试。