日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

解析ASP.NET MVC項目中視圖的單元測試(2)_.Net教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:談.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

共2頁上一頁12下一頁
來源:模板無憂//所屬分類:.Net教程/更新時間:2009-05-16
相關(guān).Net教程