解析ASP.NET MVC項(xiàng)目中視圖的單元測(cè)試(2)_.Net教程
推薦:談.NET平臺(tái)編程語(yǔ)言的未來(lái)在去年的PDC2008召開(kāi)期間,微軟逐步公開(kāi)了圍繞.NET和編程語(yǔ)言的很多想法,據(jù)此我們可以饒有興趣地對(duì).NET的未來(lái)預(yù)測(cè)一番。 .NET平臺(tái)以運(yùn)行在通用語(yǔ)言運(yùn)行時(shí)(Common Language Runtime,CLR)上的C#和VB.NET作為開(kāi)端。CLR是通用語(yǔ)言架構(gòu)(Common Language Infrast
此外,TestViewData還有一些靜態(tài)方法:
public class TestViewData
{
static TestViewData()
{
PersistentProvider = new InProcPersistentProvider();
}
public static IPersistentProvider PersistentProvider { get; set; }
public static string GenerateHostUrl(TestViewData data)
{
var key = PersistentProvider.Save(data);
return ViewHostHandlerUrl "?key=" HttpUtility.UrlEncode(key);
}
private static string ViewHostHandlerUrl
{
get
{
return ConfigurationManager.AppSettings["UnitView_ViewHostHandlerUrl"]
?? "/UnitView/ViewHostHandler.ashx";
}
}
internal static TestViewData Load(string key)
{
return PersistentProvider.Load(key);
}
...
}
GenerateHostUrl方法將委托PersistentProvider保存對(duì)象,并得到一個(gè)key。這個(gè)key將拼接在ViewHostHandlerUrl屬性上,這便是被測(cè)試的路徑。從代碼中可以看出,如果您不想使用默認(rèn)的測(cè)試路徑,只需在web.config的AppSettings節(jié)點(diǎn)中添加一個(gè)目標(biāo)地址即可。
PersistentProvider屬性為IPersistentProvider接口類(lèi)型,其中定義了Save/Load/Remove三個(gè)方法。IPersistentProvider在項(xiàng)目中只有一個(gè)實(shí)現(xiàn):InProcPersistentProvider,它會(huì)將TestViewData存放在內(nèi)存中的一個(gè)字典里。這個(gè)實(shí)現(xiàn)已經(jīng)足夠讓UnitView結(jié)合LTAF運(yùn)行(LTAF的同進(jìn)程特性起到了關(guān)鍵的作用)。不過(guò),如果您還是希望使用WatiN等獨(dú)立進(jìn)程的測(cè)試工具,就必須實(shí)現(xiàn)自己的IPersistentProvider類(lèi)型。例如您可以實(shí)現(xiàn)一個(gè)FilePersistentProvider,將TestViewData序列化至一個(gè)外部文件中,這樣就可以在合適的時(shí)候?qū)⑺』亓恕?/p>
另一個(gè)較為關(guān)鍵的類(lèi)型是UnitView.Engine.ViewHostHandler:
public class ViewHostHandler : IHttpHandler
{
private HttpContext Context { get; set; }
public void ProcessRequest(HttpContext context)
{
this.Context = context;
ControllerContext controllerContext = new ControllerContext(
new HttpContextWrapper(context),
this.Data.RouteData,
new MockController());
new ViewResult
{
MasterName = this.Data.MasterName,
ViewName = this.Data.ViewName,
TempData = this.Data.TempData,
ViewData = this.Data.ViewData,
}.ExecuteResult(controllerContext);
}
private string Key
{
get
{
string key = this.Context.Request.QueryString["key"];
if (String.IsNullOrEmpty(key))
{
throw new ArgumentNullException("key");
}
return key;
}
}
private TestViewData m_data;
private TestViewData Data
{
get
{
if (this.m_data == null)
{
this.m_data = TestViewData.Load(this.Key);
if (this.m_data == null)
{
throw new ArgumentNullException("Cannot retrieve the data.");
}
}
return this.m_data;
}
}
public bool IsReusable { get { return false; } }
}
首先,在ProcessRequest方法會(huì)取回TestViewData,并根據(jù)這些數(shù)據(jù)構(gòu)造一個(gè)ViewResult對(duì)象,最后執(zhí)行它的ExecuteResult方法來(lái)輸出視圖內(nèi)容。由于ExecuteRequest方法的需要,我們還必須構(gòu)造一個(gè)ControllerContext對(duì)象,也就意味著我們還必須提供一個(gè)Controller對(duì)象和HttpContext的封裝。從代碼中可以看出,我們這里使用了最簡(jiǎn)單的數(shù)據(jù)。由于視圖遵守“約定”,它只會(huì)從ViewData中獲取數(shù)據(jù),所以無(wú)論Controller或HttpContext是什么值都已經(jīng)無(wú)關(guān)緊要了。
您可能會(huì)想,為什么會(huì)有這樣的“約定”,不讓視圖從HttpContext對(duì)象中獲取數(shù)據(jù)呢?Mock一個(gè)HttpContext對(duì)象也不是那么困難(這里要感謝各種強(qiáng)大的Mock框架)啊。可惜,Mock后的HttpContext很難進(jìn)行序列化,這樣就幾乎杜絕了跨進(jìn)程通信的可能,這對(duì)于使用WatiN和Selenium進(jìn)行測(cè)試的朋友們無(wú)疑是一種災(zāi)難。權(quán)衡之下,老趙決定放棄對(duì)HttpContext的支持。
注1:目前UnitView基于ASP.NET MVC RC構(gòu)建,當(dāng)RTM發(fā)布后我會(huì)進(jìn)行必要的更新。請(qǐng)關(guān)注老趙這篇文章和托管在MSDN Code Gallery上的代碼(http://code.msdn.microsoft.com/UnitView)。
注2:在《ASP.NET MVC單元測(cè)試最佳實(shí)踐》中我也包含了UnitView組件,實(shí)現(xiàn)略有不同——請(qǐng)以本篇文章為主。
分享:ASP.NET如何防止用戶多次登錄常見(jiàn)的處理方法是,在用戶登錄時(shí),判斷此用戶是否已經(jīng)在Application中存在,如果存在就報(bào)錯(cuò),不存在的話就加到Application中(Application是所有Session共有的,整個(gè)web應(yīng)用程序唯一的一個(gè)對(duì)象): 以下是引用片段: string strUserId = txtUser.Text; ArrayLi
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實(shí)例(可帶附件)
- js實(shí)現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實(shí)現(xiàn)
- Asp.Net 無(wú)刷新文件上傳并顯示進(jìn)度條的實(shí)現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見(jiàn)代碼存在的偽造IP問(wèn)題探討
- VS2010 水晶報(bào)表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(kù)(連接字符串的配置及獲取)
- asp.net頁(yè)面?zhèn)髦禍y(cè)試實(shí)例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲(chǔ)過(guò)程實(shí)現(xiàn)分頁(yè)示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- 編寫(xiě)ASP.NET應(yīng)用程序的技巧
- 淺析asp.net驗(yàn)證控件失效原因及解決方法
- ASP.Net網(wǎng)絡(luò)數(shù)據(jù)庫(kù):連接到數(shù)據(jù)庫(kù)
- ASP.NET MVC :實(shí)現(xiàn)我們自己的視圖引擎
- 怎樣實(shí)現(xiàn)MSMQ的消息加密
- 基于C#的接口基礎(chǔ)教程之七
- asp.net中倒計(jì)時(shí)自動(dòng)跳轉(zhuǎn)頁(yè)面的實(shí)現(xiàn)方法(使用javascript)
- 基于C#的接口基礎(chǔ)教程之四
- 一個(gè)功能齊全的DataGrid分頁(yè)例子
- 深入Lumisoft.NET實(shí)現(xiàn)郵件發(fā)送功能的方法詳解
- 相關(guān)鏈接:
- 教程說(shuō)明:
.Net教程-解析ASP.NET MVC項(xiàng)目中視圖的單元測(cè)試(2)
。