`

为Asp.net控件写单元测试(ViewState)

 
阅读更多
通常一个典型的asp.net控件至少会用ViewState存储一些属性,以便于在页面postback后不用重新设置。在这篇文章里我将介绍如何为控件写单元测试,以确保一个属性被正确的保存在ViewState里。
为了演示,我写了一个简单的控件。
namespace Eilon.Sample.Controls {
using System;
using System.Web.UI;
public class NewLabel : Control {
public string Text {
get {
string s = ViewState["Text"] as string;
return s ?? String.Empty;
}
set {
ViewState["Text"] = value;
}
}
protected override void Render(HtmlTextWriter writer) {
writer.Write(Text);
}
}
}
这个控件只是简单的将它唯一的属性Text输出。
好的,让我们写一个简单的单元测试,以确保这个控件正确的工作。
namespace Eilon.Sample.Controls.Test {
using System;
using System.IO;
using System.Web.UI;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class NewLabelTest {
[TestMethod]
public void TextReturnsEmptyStringDefault() {
NewLabel label = new NewLabel();
Assert.AreEqual<string>(String.Empty, label.Text,
"Default text should be empty string (not null)");
}
[TestMethod]
public void GetSetText() {
const string value = "Some Text";
NewLabel label = new NewLabel();
label.Text = value;
Assert.AreEqual<string>(value, label.Text,
"Property value isn't the same as what we set");
}
[TestMethod]
public void RenderEmpty() {
NewLabel label = new NewLabel();
Assert.AreEqual<string>(String.Empty, GetRenderedText(label),
"Shouldn't have rendered anything");
}
[TestMethod]
public void RenderWithText() {
const string value = "Some Text";
NewLabel label = new NewLabel();
label.Text = value;
Assert.AreEqual<string>(value, GetRenderedText(label),
"Should have rendered the text");
}
private static string GetRenderedText(Control c) {
HtmlTextWriter writer = new HtmlTextWriter(new StringWriter());
c.RenderControl(writer);
return writer.InnerWriter.ToString();
}
}
}
看上去我们已经覆盖了100%的代码,是这样吗?事实上我们根本不能保证这个控件的属性已经被正确的存储到ViewState里了。可是我们知道与ViewState有关的函数都是protected的,并不能从外部访问。解决这个问题,可以有很多办法,这里我们写一个internal interface,
// Interface to expose protected methods from
// the Control class to our unit test
internal interface IControl {
void LoadViewState(object savedState);
object SaveViewState();
void TrackViewState();
}
然后让我们的控件去实现它:
#region IControl Members
void IControl.LoadViewState(object savedState) {
LoadViewState(savedState);
}
object IControl.SaveViewState() {
return SaveViewState();
}
void IControl.TrackViewState() {
TrackViewState();
}
#endregion
现在就可以测试ViewState了:
[TestMethod]
public void TextSavedInViewState() {
// Create the control, start tracking viewstate,
// then set a new Text value
const string firstValue = "Some Text";
const string secondValue = "ViewState Text";
NewLabel label = new NewLabel();
label.Text = firstValue;
((IControl)label).TrackViewState();
label.Text = secondValue;
// Save the control's state
object viewState = ((IControl)label).SaveViewState();
// Create a new control instance and load the state
// back into it, overriding any existing values
NewLabel newLabel = new NewLabel();
label.Text = firstValue;
((IControl)newLabel).LoadViewState(viewState);
Assert.AreEqual<string>(secondValue, newLabel.Text,
"Value restored from viewstate does not match the original value we set");
}
这里注意一点,我们的接口是internal的,为了让测试用例可以访问它,需要添加
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo("MyControlLibrary.Test")]
posted on 2007-06-05 11:51 汉广 阅读(2297) 评论(11) 编辑 收藏 所属分类: Asp.net
分享到:
评论

相关推荐

    FineUI(ASP.NET控件) v6.1.0

    FineUI(开源版)基于 ExtJS 的开源 ASP.NET 控件库。FineUI的使命创建 No JavaScript,No CSS,No UpdatePanel,No ViewState,No WebServices 的网站应用程序。支持的浏览器IE 8.0+、Chrome、Firefox、Opera、...

    FineUI(ASP.NET控件) v6.1.0.zip

    FineUI(ASP.NET控件) v6.1.0 更新日志 修正无法在后台切换工具栏显示状态的问题。 修正下拉列表后台绑定后,可能会出现F_STATE验证出错的问题。 修正AjaxTimeout无效的问题。 全局配置参数...

    ASP.NET 控件的使用

    1.2 ASP.NET控件 10 1.2.1 ASP.NET控件概览 11 1.2.2 HTML控件 12 1.2.3 理解和处理控件事件 12 1.2.4 视图状态 17 1.3 ASP.NET页面 20 1.3.1 动态编译 20 1.3.2 控件树 23 1.3.3 使用代码隐藏页面 24 1.3.4 处理...

    asp.net教程 ASP.NET 参考手册

    本章介绍 ASP.NET 服务器控件。 ASP.NET 事件 本章介绍一些 ASP.NET 事件句柄。 ASP.NET Forms ASP.NET WEB 表单 本章介绍 ASP.NET 的 WEB 表单。 ASP.NET 维持 ViewState 本文讲解如何维持 ViewState。 ASP...

    庖丁解牛:纵向切入ASP.NET 3.5控件和组件开发技术

    8.1 asp.net服务端控件对客户端的支持 297 8.2 clientscriptmanager类功能详解 301 8.2.1 registerarraydeclaration方法 301 8.2.2 registerclientscriptblock方法 302 8.2.3 registerclientscriptinclude方法 ...

    方配ASP.NET模板引擎源码v2.1

    在ASP.NET开发中,一般情况下,网站的前台程序不使用.NET控件模式,性能都得到了提升。.NET控件的开发方式比较有利于提高开发效率,提高模块的重用性,但缺陷是性能上会有一些损失,例如不用数据绑定,显然也就不必...

    ASP.NET常见问题集锦.zip

    ASP.NET ViewState 初探.doc ASP.NET Web 方法中的 XmlElement 参数的功能.d ASP.NET 中 Cookie 的基本知识.doc ASP.NET 页面对象模型.doc asp.net200问-专家门诊—ASP.NET开发答疑 ASP.NetWebPage深入探讨....

    FineUI(ASP.NET UI控件) v4.1.3.rar

    基于 ExtJS 的开源 ASP.NET 控件库。 FineUI的使命 创建 No JavaScript,No CSS,No UpdatePanel,No ViewState,No WebServices 的网站应用程序。 支持的浏览器 IE 8.0 、Chrome、Firefox、Opera、Safari bulid...

    基于ExtJS的ASP.NET控件库(FineUI) v4.1.6.rar

    FineUI是一个基于ExtJS的ASP.NET控件库,该控件在浏览器方面支持IE 7.0 、Firefox 3.6 、Chrome 3.0 、Opera 10.5 、Safari 3.0 等。FineUI v3.2.6 主要增加了 “表格内编辑” 功能,功能还在测试,希望大家提出好的...

    ASP.NET.4揭秘

    1.2 asp.net控件11 1.2.1 asp.net控件概览11 1.2.2 html控件12 1.2.3 理解和处理控件事件13 1.2.4 视图状态18 1.3 asp.net页面22 1.3.1 动态编译23 1.3.2 控件树25 1.3.3 使用代码隐藏页面27 1.3.4 处理页面事件30 ...

    庖丁解牛纵向切入ASP.NET 3.5控件和组件开发技术.pdf

     本书主要介绍asp.net的控件开发,书中通过70多个例子讲解了asp.net控件开发技术的各个方面,而且剖析了很多控件中系统基类源代码,读者从这些系统源代码可以体会设计模式思想。如果扎实地掌握了asp.net控件的运行...

    asp.net知识库

    利用反射实现ASP.NET控件和数据实体之间的双向绑定,并且在客户端自动验证输入的内容是否合法 asp.net报表解决方法 SQLDMO类的使用 SQL过程自动C#封装,支持从表到基本存储过程生成 使用SQLDMO控制 SQL Server 使用SQL...

    方配ASP.NET模板引擎及开发教程和案例

    提高模块的重用性,但缺陷是性能上会有一些损失,例如不用数据绑定,显然也就不必判断数据来源和转换数据类型,不用页面控件和控件事件等,也就避免了使用ViewState,此外.NET控件往往追求功能齐全,当你只需要一...

    方配ASP.NET模板引擎 v2.1

    提高模块的重用性,但缺陷是性能上会有一些损失,例如不用数据绑定,显然也就不必判断数据来源和转换数据类型,不用页面控件和控件事件等,也就避免了使用ViewState,此外.NET控件往往追求功能齐全,当你只需要一...

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part1

    17.3 asp.net ajax对服务器控件支持的基类 612 17.3.1 ajax控件支持的基类 612 17.3.2 ajax控件应用示例 623 17.4 本章总结 636 附录a .net 3.5技术教程系列——collection/asp.net ajax/ silverlight/jquery .....

    庖丁解牛 纵向切入ASP.NET 3.5控件和组件开发 part2

    17.3 asp.net ajax对服务器控件支持的基类 612 17.3.1 ajax控件支持的基类 612 17.3.2 ajax控件应用示例 623 17.4 本章总结 636 附录a .net 3.5技术教程系列——collection/asp.net ajax/ silverlight/jquery .....

    ASP.NET Night Words

    6.1 asp.net服务器控件简介 68 6.2 button控件 69 6.3 textbox控件 75 6.4 asp.net服务器控件的特殊 6.4 客户端事件 78 6.5 fileupload控件 81 6.6 literal控件 84 6.7 panel控件 86 6.8 placeholder控件 88...

    asp.net教学讲义

    3.4 ASP.NET2.0新增控件 45 3.4.1 ImageMap控件 45 3.4.2 FileUpload控件 48 3.5 客户端处理 52 3.5.1 第一种方式示例: 52 3.5.2第二种方式:动态注册javascript指令块 53 3.6验证控件 54 3.6.1验证控件简介 54 ...

    方配ASP.NET模板引擎 v2.1.zip

    提高模块的重用性,但缺陷是性能上会有一些损失,例如不用数据绑定,显然也就不必判断数据来源和转换数据类型,不用页面控件和控件事件等,也就避免了使用ViewState,此外.NET控件往往追求功能齐全,当你只需要一...

    ASP.NET教学讲义,完整章节

    3.4 ASP.NET2.0新增控件 54 3.5 客户端处理 61 3.6验证控件 63 3.7自定义验证控件 71 3.8验证总结控件 73 第四章:ASP.NET内置对象 76 4.1内置对象概述 76 4.2 Response对象和Request对象 76 4.3、HttpServerUtility...

Global site tag (gtag.js) - Google Analytics