解析ASP.NET MVC項目中視圖的單元測試(2)_.Net教程
推薦:談.NET平臺編程語言的未來在去年的PDC2008召開期間,微軟逐步公開了圍繞.NET和編程語言的很多想法,據(jù)此我們可以饒有興趣地對.NET的未來預(yù)測一番。 .NET平臺以運行在通用語言運行時(Common Language Runtime,CLR)上的C#和VB.NET作為開端。CLR是通用語言架構(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保存對象,并得到一個key。這個key將拼接在ViewHostHandlerUrl屬性上,這便是被測試的路徑。從代碼中可以看出,如果您不想使用默認的測試路徑,只需在web.config的AppSettings節(jié)點中添加一個目標地址即可。
PersistentProvider屬性為IPersistentProvider接口類型,其中定義了Save/Load/Remove三個方法。IPersistentProvider在項目中只有一個實現(xiàn):InProcPersistentProvider,它會將TestViewData存放在內(nèi)存中的一個字典里。這個實現(xiàn)已經(jīng)足夠讓UnitView結(jié)合LTAF運行(LTAF的同進程特性起到了關(guān)鍵的作用)。不過,如果您還是希望使用WatiN等獨立進程的測試工具,就必須實現(xiàn)自己的IPersistentProvider類型。例如您可以實現(xiàn)一個FilePersistentProvider,將TestViewData序列化至一個外部文件中,這樣就可以在合適的時候?qū)⑺』亓恕?/p>
另一個較為關(guān)鍵的類型是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方法會取回TestViewData,并根據(jù)這些數(shù)據(jù)構(gòu)造一個ViewResult對象,最后執(zhí)行它的ExecuteResult方法來輸出視圖內(nèi)容。由于ExecuteRequest方法的需要,我們還必須構(gòu)造一個ControllerContext對象,也就意味著我們還必須提供一個Controller對象和HttpContext的封裝。從代碼中可以看出,我們這里使用了最簡單的數(shù)據(jù)。由于視圖遵守“約定”,它只會從ViewData中獲取數(shù)據(jù),所以無論Controller或HttpContext是什么值都已經(jīng)無關(guān)緊要了。
您可能會想,為什么會有這樣的“約定”,不讓視圖從HttpContext對象中獲取數(shù)據(jù)呢?Mock一個HttpContext對象也不是那么困難(這里要感謝各種強大的Mock框架)啊�?上�,Mock后的HttpContext很難進行序列化,這樣就幾乎杜絕了跨進程通信的可能,這對于使用WatiN和Selenium進行測試的朋友們無疑是一種災(zāi)難。權(quán)衡之下,老趙決定放棄對HttpContext的支持。
注1:目前UnitView基于ASP.NET MVC RC構(gòu)建,當RTM發(fā)布后我會進行必要的更新。請關(guān)注老趙這篇文章和托管在MSDN Code Gallery上的代碼(http://code.msdn.microsoft.com/UnitView)。
注2:在《ASP.NET MVC單元測試最佳實踐》中我也包含了UnitView組件,實現(xiàn)略有不同——請以本篇文章為主。
分享:ASP.NET如何防止用戶多次登錄常見的處理方法是,在用戶登錄時,判斷此用戶是否已經(jīng)在Application中存在,如果存在就報錯,不存在的話就加到Application中(Application是所有Session共有的,整個web應(yīng)用程序唯一的一個對象): 以下是引用片段: string strUserId = txtUser.Text; ArrayLi
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實例(可帶附件)
- js實現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進度條的實現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現(xiàn)分頁示例代碼
- 相關(guān)鏈接:
- 教程說明:
.Net教程-解析ASP.NET MVC項目中視圖的單元測試(2)
。