“增强”组合框的所需功能是一种快速查找方法。组合框中的每个项目都有一个 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/