我正在研究使用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或其他模式,但想知道是否有任何方法可以将此企业应用程序转换为可测试的。
答案 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)