ASP.NET - 如何对WebControls进行单元测试?

时间:2008-08-27 20:19:45

标签: asp.net unit-testing

好的。

所以我认为这是我进入单元测试的时间,因为每个人都在敲打它已经足够长的时间了。我已经安装了NUnit并经历了一些“单元测试介绍”类型教程。

我目前正在组建一个小框架来帮助重建我们的一个网络应用程序,所以我为我的框架创建了一个VS2008项目,我想在我去的时候进行单元测试。

我如何进行单元测试WebControls?这些方法都是受保护的或私有的,因为它是一个框架,除了WebControls之外别无其他。

任何指针?

伯恩斯

9 个答案:

答案 0 :(得分:8)

您可以在不使用完整框架的情况下执行模型 - 视图 - 控制器或模型 - 视图 - 演示者类型体系结构。您已经发现单元测试ui组件很难。有办法,但你可能不想走这条路。通常这会使你的测试很难维护,更多的维护噩梦是程序员无法做到的事情: - )

尝试在“控制器”或“演示者”类中分离要测试的功能。然后测试那个班级。为了使其更易于测试,您可以隐藏界面后面的usercontrol类(视图),并使控制器或演示者通过界面与视图对话。这样你就可以在测试中模拟视图。

我知道这听起来像是很多工作而且似乎是一种解决方法但是如果你习惯了它,这是一个非常好的架构,可以更容易地改变你的行为。当你真正需要它时,你总是可以开始使用“真正的”mvc框架: - )

答案 1 :(得分:5)

使用assembly:InternalsVisibleTo属性,您将能够访问这些私人成员。

将它放入webcontrol项目的 AssemblyInfo.cs (在属性节点下)

[assembly:InternalsVisibleTo("YourTestProjectName")]

答案 2 :(得分:3)

你已经找到了ASP.NET最大的痛点。至于密封的私人课程,阻碍单元测试。

这是TDD人员使用MVC框架(ASP.NET MVC,Castle MonoRail)的主要原因,因为它提供了视图模板和控制器逻辑的清晰分离。控制器完全可测试。

答案 3 :(得分:1)

This是一篇旧文章,但是我在2004年使用NUnitASP为asp.net WebControls编写了nunit测试。那篇文章给出了一个使用他们创建相应的概念来测试一个简单控件的详细示例。 “Tester”类,它从您的测试中封装您的控件的详细信息。测试器可以(应该)与控件在同一个程序集中,因此可以在它们之间共享一些东西(例如实用程序函数,常量等)。

我现在仍然使用这种技术(和其他人使用该技术的变体)来测试非常复杂的控件。

我希望这有用。

答案 4 :(得分:1)

您还可以通过浏览器查看测试组件,因为用户可以使用WebAii等测试框架看到它们。我看到它的工作和非常酷。我也被告知你可以将它插入自动构建中,但我还没有看到它。

希望它有所帮助...

答案 5 :(得分:0)

上面提到的MVC框架是测试控件功能的最佳方法。然而,测试它是如何工作的有点不同。

这完全不在袖口上,但您可以让用户控件公开一些受保护的方法和属性以返回验证信息,然后让测试用户控件继承它。该控件可以填充字段,按下按钮,什么不是。有点乱,但它可以工作。

答案 6 :(得分:0)

您还可以查看此Rhino Igloo框架。它是WebForms的受损MVC框架。

答案 7 :(得分:0)

Ivonna 可以在Asp.Net上下文中单独测试WebControl 只需调用session.GetControl(“Path.ascx”)并验证它是否具有所有必需的属性。

答案 8 :(得分: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);
    }
}