2008-08-27 88 views
13

好的。ASP.NET - 你如何測試WebControls?

所以我認爲這是關於我進入單元測試的時間,因爲每個人都一直在喋喋不休。我已經安裝了NUnit,並通過了一些「單元測試入門」類型的教程。

我目前組建了一個小的框架,以幫助重建我們的Web應用程序之一,所以我創建了一個VS2008項目我的框架,我想單元測試,我去。

我該怎麼做單元測試WebControl?這些方法都是受保護的或私有的,因爲它是一個框架,除了WebControls之外沒有其他的東西。

任何指針?

伯恩斯

回答

8

您可以在不使用完整框架的情況下執行模型視圖控制器或模型視圖演示器類型體系結構。你已經發現單元測試UI組件很困難。有辦法解決這個問題,但你可能不想走這條路。通常這會讓你的測試非常難以維護,更多的維護噩夢是程序員無需做的事情:-)

嘗試在「控制器」或「演示者」類中分離出要測試的功能。然後測試該課程。爲了使其更具可測性,您可以隱藏界面後面的usercontrol類(視圖),並讓控制器或演示者通過界面與視圖進行交談。這樣你可以在你的測試中模擬視圖。

我知道這聽起來像一個大量的工作,這似乎是一個解決辦法,但如果你習慣了這個它是一個真的很好的架構,使得它更容易改變UI行爲。您可以隨時開始使用一個「真正」的MVC框架,當你真的需要它:-)

5

UES的assembly:InternalsVisibleTo屬性,你就可以訪問這些私有成員。

把它放在你的夏精項目的AssemblyInfo.cs(下屬性節點)

[assembly:InternalsVisibleTo("YourTestProjectName")] 
3

你已經找到ASP.NET的最大痛點。至於密封的私人班,阻礙單元測試。

這是TDD的人將使用MVC框架(ASP.NET MVC,城堡單軌),因爲它從您的視圖模板和控制器邏輯提供了一個明確分工的主要原因。控制器是完全可測試的。

0

上面提到的MVC框架是測試控制做什麼的最佳途徑。然而,測試它的工作方式有點不同。

這完全是即興的,但你可以讓用戶控制揭露一些保護的方法和屬性返回確認信息,然後有一個測試用戶控件繼承它。該控件可以填充字段,按按鈕和不按鈕。有點混亂,但它可以工作。

0

你也可以看看這個Rhino Igloo框架。這是一個受損的WebForms MVC框架。

1

This是一個古老的文章了,但我是用NUnitASP編寫asp.net器WebControls NUnit的測試在2004年。該文章給出了一個使用他們的概念創建相應的「測試器」類來測試簡單控件的詳細示例,該類將封裝測試的控件細節。測試人員可以(應該)也可以與您的控件位於同一個程序集中,因此可以在它們之間共享一些內容(例如實用程序函數,常量等)。

我今天仍然使用技術(和其他人使用該技術的變體)來測試非常複雜的控制。

我希望這會有幫助。

+1

斯科特,這個鏈接現在分成:( – Jono 2012-10-16 03:33:43

0

Ivonna 可以隔離測試器WebControls時,Asp.Net背景 內只需撥打session.GetControl(「Path.ascx」),並驗證其擁有所有必要的屬性。

1

您也可以通過瀏覽器查看測試組件,如用戶使用測試框架(例如WebAii)查看它們。我已經看到它的工作,它非常酷。我也被告知可以將它插入自動化版本,但我還沒有看到。

希望它可以幫助...

0

你測試他們是這樣的:

[Test] 
public void ConditionQueryBuilderTest_RendersProperHtml() 
{ 
    var sw = new StringWriter(); 
    var queryBuilder = new ConditionQueryBuilderStub 
    { 
     ID = "UnitTestbuilder", 
     QueryBuilderURL = @"\SomeAspxPage\SomeWebMethod", 
     ResetQueryBuilderURL = @"\SomeAspxPage\OnQueryBuilderReset", 
     FilterValuesCollection = new Dictionary<int, string> { {15, "Some Condition"}} 
    }; 
    queryBuilder.RenderAllContents(new HtmlTextWriter(sw)); 

    AppendLog(sw.ToString()); 

    Assert.AreEqual(ExpectedHtml, sw.ToString()); // ExpectedHTML is the raw expected HTML 
} 

這裏是我的存根:

internal class ConditionQueryBuilderStub : ConditionQueryBuilder // ConditionQueryBuilder is a WebControl 
{ 
    internal void RenderAllContents(HtmlTextWriter writer) 
    { 
     RenderContents(writer); 
    } 
}