我正在尝试创建我自己的EasyBinderDropDown,目前看起来像这样:
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.BindToProperties(myCustomers,c =&gt; c.Name,c =&gt; c.Id)这样的东西,它对你有用,通过设置ShowSelectionPrompt和SelectionPromptText,我可以轻松拥有“选择客户”行。我不想过多询问我的具体实现,而是对于如何为某些场景编写单元测试感到困惑。
例如,我当前的测试涵盖了在加载过程中正确创建的控件并正确显示其输出,但我很遗憾如何测试控件回发时会发生什么。谁能给我一些关于如何测试的建议?我宁愿这样做而不必模拟HTTPContext或类似的东西,有没有办法模拟正在重建的控件?
答案 0 :(得分:2)
“我更愿意这样做,而不必模拟HTTPContext或类似的东西,有没有办法模拟正在重建的控件。”
根据定义,您不是要求“单元测试”;您正在寻找“集成测试”。如果您没有模拟主要的依赖项,在本例中是ASP.NET运行时组件,那么您正在测试的是控件和ASP.NET之间的集成。
如果您不想模仿HttpContext和朋友,那么我会建议一个自动化的Web测试框架,如Selenium或NUnitAsp。
答案 1 :(得分:0)
更新:根据评论。没有代码直接访问IsPostback或其他asp.net的东西。用简单的类/接口包装它们。完成后,发送实现这些接口的模拟。这样你就不必模拟整个HttpContext,只需要对代码重要的部分(基于所涉及的接口,这些部分非常清楚)。
另外,鉴于它是一个asp.net自定义控件,您不希望强制要求依赖注入等外部事务。有一个默认(无参数)构造函数,它设置控件以使用asp.net的东西。使用具有更多参数的构造函数来发送模拟版本。
初步答复:
在我看来,您正在寻找单元测试和集成测试之间的愉快中间点。您正在使用自定义控件,这可能会在asp.net的页面生命周期的不同部分出错。
我会:
您在c#中使用watin / selenium rc编写测试,并在“单元”测试框架中运行它们。确保将它们与单元测试分开,因为它们显然会慢一些。
聚苯乙烯。我没有使用过asp.net的ms测试支持,它可能会支持你正在寻找的东西。