2008-08-27 86 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); 
    } 
}