Asp.net 如何在回发时对服务器控件进行单元测试?

Asp.net 如何在回发时对服务器控件进行单元测试?,asp.net,unit-testing,Asp.net,Unit Testing,我正在尝试创建自己的EasyBinder下拉列表,当前的外观如下: public class EasyBinderDropDown : DropDownList, ICanBindToObjectsKeyValuePair { public void BindToProperties<TYPE_TO_BIND_TO>(IEnumerable<TYPE_TO_BIND_TO> bindableEnumerable,

我正在尝试创建自己的EasyBinder下拉列表,当前的外观如下:

public class EasyBinderDropDown : DropDownList, ICanBindToObjectsKeyValuePair {
        public void BindToProperties<TYPE_TO_BIND_TO>(IEnumerable<TYPE_TO_BIND_TO>
                  bindableEnumerable,
        Expression<Func<TYPE_TO_BIND_TO, object>> textProperty, 
        Expression<Func<TYPE_TO_BIND_TO, object>> valueProperty) {...}
        public bool ShowSelectionPrompt { get; set; }
        public string SelectionPromptText { get; set; }
        public string SelectionPromptValue { get; set; }
    //...
}
基本上,它非常有助于从代码内部轻松绑定到对象,因为您只需执行类似于_dropDown.BindToPropertiesmyCustomers、c=>c.Name、c=>c.Id的操作,并且它对您有效,通过设置ShowSelectionPrompt和SelectionPrompText,我可以轻松地拥有一个选择客户行。我不想问太多关于我的具体实现的问题,而是对如何为某些场景编写单元测试感到困惑

例如,我当前的测试包括在加载期间正确创建控件,并使其输出正确呈现,但我不知道如何测试控件发回时会发生什么。有谁能给我一些关于如何测试的建议吗?我更愿意这样做,而不必模拟HTTPContext或类似的东西,有没有一种方法可以模拟正在重建的控件?

更新:基于注释。不要直接访问IsPostback或其他asp.net内容的代码。用简单的类/接口包装它们。完成后,发送实现这些接口的模拟。通过这种方式,您不必模拟整个HttpContext,只需模拟代码中重要的部分,这些部分基于所涉及的接口非常清晰

另外,由于它是一个asp.net自定义控件,所以您不希望强制要求依赖项注入等外部事物。有一个默认的无参数构造函数,该构造函数将控件设置为使用asp.net内容。使用具有更多参数的构造函数发送模拟版本

初步答复:

在我看来,您正在寻找单元测试和集成测试之间的一个愉快的中间点。您使用的是自定义控件,它可能在asp.net页面生命周期的不同部分出错

我想:

检查是否可以移动部分代码 超出自定义控件以进行分离 类,您可以更轻松地进行单元测试 对于简单的场景,依赖于项目其余部分的功能测试来发现控制使用watin/selenium rc的任何进一步问题。 对于更复杂的场景,就像控件将在不同的并行项目中使用或将交付给公众一样,设置一些测试页面并再次针对它进行自动化watin/selenium rc。 您可以在c中用watin/selenium rc编写测试,并在单元测试框架中运行它们。确保将它们与单元测试分开,因为它们显然会运行得较慢


另外,我还没有使用asp.net的ms test支持,它可能对您正在寻找的东西有一些支持。

我更愿意这样做,而不必模拟HTTPContext或类似的东西,有没有一种方法可以模拟正在重建的控件

根据定义,您不是要求进行单元测试;您正在寻找集成测试。如果您没有模拟主要依赖项(在本例中为ASP.NET运行时组件),那么您要测试的是控件与ASP.NET之间的集成


如果你不想嘲弄HttpContext和朋友,那么我建议你使用一个自动化的web测试框架,比如Selenium或NUnitAsp。

Uh-oh。

34分钟前我问过这个问题,它已经在google for asp.net单元测试回发中排名第一了。我会得到一个答案吗?我听到人们谈论使用它。但我自己没有经验,真的吗?没有更简单的方法吗?Selenium是一个全浏览器遥控器,我只想用ASP.NET没有的方法来重建我的控件。我通过简单的TDD开发了该控件,但我发现我的测试没有涵盖控件在回发过程中重建的场景,而回发过程正是控件崩溃的时候。在我的类中,要提取的代码很少,我只需要简单场景的覆盖范围。我想最终的问题是我不知道如何通过回发场景进行TDD。WatiN是一个解决方案,但似乎已经完成overkill@George检查我的更新。请注意,我所说的关于asp.net页面生命周期的内容仍然适用,因此您需要仔细研究生命周期以及它如何影响自定义控件的代码。我想是的,我所寻找的更多是框架以这种简单的方式重建控件并将其传递给viewstate,就这样做吧。我听说没那么简单。。。