c# - 为了可测试性,向 ComboBox 添加功能的正确方法是什么?

标签 c# .net winforms unit-testing testability

“增强”组合框的所需功能是一种快速查找方法。组合框中的每个项目都有一个 ToString() 方法,以便它们可以显示在下拉列表中。单击下拉列表中的项目时,组合框的观察者会收到选择通知。

此外,每当组合框中键入的文本发生变化时,都会生成一个“候选”列表,该列表由下拉列表中包含目前键入的文本的所有项目组成。按 Enter 键会将您带到该列表中的第一个候选者,重复按 Enter 键会在列表中循环。

我已经通过从 ComboBox 派生来实现此功能 - 我认为这是有道理的,因为我仍然在功能上留下一个组合框,它只是添加了这个“QuickFind”功能。然而,创建候选列表并在其中循环的逻辑虽然简单,但并非完全微不足道,需要进行一些测试。

然而,如所见here仅仅通过构建 ComboBox 并触发我添加的额外例程来测试它似乎并不那么容易——它需要存在于一个表单上,以便它的行为方式与它在应用程序中的行为方式相同。这似乎是为了测试一个简单的组合框的简单添加而付出的太多努力!

循环遍历候选人的代码中没有任何内容是我的应用程序特有的,但是我已经创建了一个可以在任意数量的上下文中使用的通用控件,唯一的要求是组合框中的对象具有 ToString()方法,这与对进入普通组合框的对象的限制相同,由 C# .NET 保证。

那么,考虑到可测试性,您会将增强的功能放在哪里?

最佳答案

与您引用的帖子一样:将逻辑与 gui 元素分开也是这里的解决方案。

您应该考虑使用一个类似 Controller 的类,它公开一个项目列表,您可以将这些项目数据绑定(bind)到您的 ComboBox 的数据源。 Controller 本身负责维护这个列表。

因此,无论何时您在 ComboBox 中键入一个字母,您都会调用 Controller 上的一个函数,比方说 UpdateList(string typedString)。通过这种方式,您已经分离了用“候选人”填充列表的逻辑。

现在您可以轻松编写大量测试,每个测试使用不同的参数调用 UpdateList(),然后检查项目列表。不需要 GUI 东西来进行测试,您只是在测试算法本身。

关于c# - 为了可测试性,向 ComboBox 添加功能的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/487100/

相关文章:

c# - 从文件名可变的文件中提取日期

C# 如何在继续之前等待网页完成加载

c# - 响应式框架消除了 Observable.Create 中的 while 循环

c# - 类型 : how to get type from string

c# - 使用 C# 在数据网格中显示 xml

c# - linq-to-sql 分组匿名类型

.net - Powershell XMLDocument 保存为没有 BOM 的 UTF-8

c# - 更改月历大小

c# - 从隐藏的控制台应用程序显示表单

c# - 使用ParseExact解析DateTime,我缺少什么?