单元测试WebForm的UI逻辑及文件上传
作者:网络转载 发布时间:[ 2013/1/28 10:42:36 ] 推荐标签:
BS系统中的UI部分的逻辑测试,首要的是要模拟请求(Request)和输出(Response),而WebForm又跟MVC不一样,后者的Response,Request等HTTP上下文对象均有接口支持,很容易模拟,而查看WebForm的对应对象,如Response,我们首先看到的声明是:
public sealed class HttpResponse
无接口,并且是sealed,换句话说,我们要测试一个如下的的Code-Behind函数的逻辑正确性,该怎么测试:
protected void Page_Load(object sender, EvengArgs e)
{
this.Response.Write("test u");
}
好在FCL中有现成的包装类HttpResponseWrapper来解决我们的烦恼(不然得自己写包装类),我们将上面的代码改成如下的形式,它可以变得可测试:
protected HttpResponseBase _response;
protected override void OnPreLoad(EventArgs e)
{
base.OnPreLoad(e);
_response = new HttpResponseWrapper(this.Response);
}
protected void Page_Load(object sender, EvengArgs e)
{
_response.Write("test u");
}
上面的重构,并不影响原有功能的实现,同时却将代码修改成可测试的,
1:首先,this.Response被替代成可以被模拟的HttpResponseBase;
2:其次,方法Page_Load内部不再负责生成被依赖的对象的生成;
即,我们将_response的生成放到方法的外部。这个外部,可以是构造器等,不过由于webform本身的特殊性,在构造器中,this.Response上下文还不可用,所以在这个例子中放到了OnPreLoad中。
接下来看看测试类的编写,先说点额外话,Page_Load是protected的,要让测试类可以访问到它,需改成public或者干脆让测试类继承我们的当前页面,这里采用的是后者:
[TestClass]
public class _DefaultTest: _Default ////很明显,这里测试的是Default.aspx.cs这个类
{
public Mock
[TestMethod]
StringWriter sw = new StringWriter();
FakeResponse.Setup(x=>x.Write(It.IsAny
this.Page_Load(null,null);
public void LoadOk()
{
FakeResponse = new Mock
FakeResponse.SetupGet(x=>x.OutPut).Returns(sw);
this._response = FakeResponse.Object;
{
sw.Write(x);
sw.Flush();
}
Assert.AreEqual(
“test u”,
(FakeResponse.Object.Output as StringWriter).ToString();
}
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11