久久天堂一区二区三区_国内精品久久久久影院网站_亚洲国产一区二区三区最新_亚洲国产一区二区三区四区五区

北京北大青鳥校區:Asp.net控件的單元測試

通常一個典型的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.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(value, label.Text,Property value isn't the same as what we set);}[TestMethod]public void RenderEmpty() {NewLabel label = new NewLabel();Assert.AreEqual(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(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 testinternal interface IControl {void LoadViewState(object savedState);object SaveViewState();void TrackViewState();}
然后讓我們的控件去實現它:

    #region IControl Membersvoid 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 valueconst 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 stateobject viewState = ((IControl)label).SaveViewState();// Create a new control instance and load the state// back into it, overriding any existing valuesNewLabel newLabel = new NewLabel();label.Text = firstValue;((IControl)newLabel).LoadViewState(viewState);Assert.AreEqual(secondValue, newLabel.Text,Value restored from viewstate does not match the original value we set);}

這里注意一點,我們的接口是internal的,為了讓測試用例可以訪問它,需要添加

    using System.Runtime.CompilerServices;[assembly: InternalsVisibleTo(MyControlLibrary.Test)]
文章來源:北京北大青鳥校區學術部

北大青鳥網上報名
北大青鳥招生簡章
久久天堂一区二区三区_国内精品久久久久影院网站_亚洲国产一区二区三区最新_亚洲国产一区二区三区四区五区

      欧美亚洲一区二区在线观看| 国产一区二区成人久久免费影院| 国产精品久久久久一区| 亚洲激情第一页| 午夜一区二区三区不卡视频| 国产婷婷成人久久av免费高清| 亚洲在线观看视频| 国产精品网红福利| 欧美大秀在线观看| 欧美在线资源| 亚洲第一福利在线观看| 国产精品高潮呻吟久久| 欧美风情在线观看| av不卡在线| 激情成人av在线| 国产精品推荐精品| 国产精品美女久久久久久2018| 亚洲欧美国产日韩中文字幕| 国产欧美日韩在线观看| 欧美午夜在线视频| 欧美色视频在线| 欧美日韩中国免费专区在线看| 久热成人在线视频| 久久久国产精品亚洲一区 | 久久久91精品国产一区二区三区 | 国产一区香蕉久久| 国产在线精品一区二区夜色| 国产精品国产福利国产秒拍| 欧美日本久久| 国产免费观看久久黄| 欧美亚洲不卡| 国产色综合天天综合网| 黄色精品一二区| 日韩视频中文字幕| 国产精品99久久久久久久vr| 99视频超级精品| 亚洲欧美成人网| 久久天天躁夜夜躁狠狠躁2022 | 新67194成人永久网站| 久久久久久网站| 欧美伦理视频网站| 国产精品一区二区久久久| 国产精品日韩精品| 亚洲国产高清高潮精品美女| 亚洲视频在线视频| 欧美777四色影视在线| 国产精品国产三级国产普通话三级 | 蜜臀久久99精品久久久久久9 | 亚洲欧美日韩国产中文在线| 久久精品毛片| 国产日本欧美视频| av成人黄色| 欧美国产视频在线| 影院欧美亚洲| 久久蜜桃资源一区二区老牛| 欧美性感一类影片在线播放| 狠狠色丁香婷婷综合| 亚洲一级电影| 欧美性做爰猛烈叫床潮| 亚洲图片在线| 国产美女搞久久| 亚洲一二三区在线观看| 欧美午夜精品久久久久久浪潮| 在线观看日产精品| 在线看欧美视频| 欧美精品在线看| 一区二区三区精密机械公司 | 一本色道久久88综合日韩精品| 欧美日在线观看| 久久在线免费观看视频| 国产伦精品一区二区| 亚洲视频一区二区在线观看 | 国内精品久久久久久久果冻传媒 | 欧美色另类天堂2015| 日韩午夜剧场| 欧美精品日韩一本| 日韩一区二区免费高清| 欧美日韩第一区| 亚洲自拍电影| 国产亚洲欧美日韩日本| 美日韩免费视频| 香蕉免费一区二区三区在线观看| 国外视频精品毛片| 国产精品久久久| 久久综合精品国产一区二区三区| 亚洲精品五月天| 黄色亚洲精品| 国产精品免费视频xxxx| 免费在线观看日韩欧美| 亚洲男人av电影| 亚洲精品一区在线观看| 影音先锋亚洲一区| 国产精品专区一| 国产精品美女999| 国产精品乱人伦中文| 国产久一道中文一区| 国产一区二区三区在线观看视频| 国产精品推荐精品| 欧美剧在线免费观看网站| 欧美成人激情视频| 欧美乱大交xxxxx| 国产精品久久久久av免费| 久久精品99国产精品| 能在线观看的日韩av| 免费一区视频| 久久久精品国产99久久精品芒果| 亚洲午夜久久久久久久久电影院| 在线日韩日本国产亚洲| 亚洲国产裸拍裸体视频在线观看乱了 | 国产一区二区三区奇米久涩| 国产日韩欧美二区| 日韩亚洲精品视频| 久久精品一区二区三区不卡牛牛| 欧美成人一品| 国产一区二区三区免费不卡| 久久精品欧美| 亚洲精品视频在线播放| 国产精品女人久久久久久| 狼人社综合社区| 久久久美女艺术照精彩视频福利播放| 亚洲高清在线| 亚洲精品中文字幕在线观看| 精品成人a区在线观看| 激情另类综合| 久久精品国产一区二区电影| 美国十次成人| 欧美精品一区在线| 国内一区二区三区| 国产精品毛片高清在线完整版| 麻豆精品一区二区av白丝在线| 久久久91精品国产| 久久免费视频在线观看| 亚洲一区激情| 欧美一区二区视频网站| 亚洲欧美精品一区| 亚洲视频精选在线| 国产伦精品一区二区三| 国产精品剧情在线亚洲| 欧美一区二区在线免费播放| 亚洲欧洲一区二区三区在线观看| 在线欧美日韩国产| 亚洲欧美国产三级| 久久精品噜噜噜成人av农村| 国产日韩一区二区| 亚洲国产精品电影在线观看| 欧美日韩精品欧美日韩精品 | 欧美日韩免费精品| 久久精品视频播放| 欧美影院午夜播放| 亚洲一区免费| 国产精品资源| 久久婷婷国产麻豆91天堂| 亚洲第一精品福利| 欧美日韩爆操| 老色鬼精品视频在线观看播放| 亚洲第一毛片| 国产精品久久久久久久久久妞妞 | 另类激情亚洲| 亚洲欧美国产日韩天堂区| 欧美视频福利| 夜夜爽99久久国产综合精品女不卡| 久热精品视频在线| 精品福利电影| 久久精品夜色噜噜亚洲a∨| 欧美精品综合| 激情视频亚洲| 母乳一区在线观看| 国产亚洲精品久久飘花| 久久三级福利| 久久精品亚洲一区二区| 亚洲一区二区三区在线看| 亚洲丁香婷深爱综合| 国产欧美午夜| 国产欧美日韩在线| 欧美日韩色综合| 欧美特黄一区| 欧美三级视频在线观看| 国产精品v亚洲精品v日韩精品| 久久久福利视频| 免费在线国产精品| 欧美精品偷拍| 国产精品s色| 国产日韩欧美一区二区三区在线观看 | 激情成人av| 亚洲国产视频一区二区| 日韩一级免费| 亚洲欧美一区二区原创| 麻豆国产精品一区二区三区| 久久精品国产综合| 久久国产一区| 亚洲高清av| 亚洲精品国产精品国自产在线| 国产精品男女猛烈高潮激情 | 麻豆freexxxx性91精品| 亚洲欧洲精品一区二区精品久久久| 久久久免费av| 老司机午夜精品| 欧美成人tv| 美女被久久久| 国产精品国产三级国产aⅴ入口|