C# 什么';为了可测试性,向组合框添加功能是正确的方法吗?

C# 什么';为了可测试性,向组合框添加功能是正确的方法吗?,c#,.net,winforms,unit-testing,testability,C#,.net,Winforms,Unit Testing,Testability,“增强”组合框所需的功能是一种快速查找方法。combobox中的每个项都有一个ToString()方法,这样它们就可以显示在下拉列表中。单击下拉列表中的项目时,组合框的观察者将收到选择通知 此外,每次组合框中键入的文本发生更改时,都会生成一个“候选项”列表,由下拉列表中包含迄今为止键入的文本的所有项目组成。按enter键可以找到该列表中的第一个候选项,反复按enter键可以在列表中循环 我通过从ComboBox派生实现了这个功能-我认为这是有意义的,因为我仍然保留一个ComboBox,它只是添加

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

此外,每次组合框中键入的文本发生更改时,都会生成一个“候选项”列表,由下拉列表中包含迄今为止键入的文本的所有项目组成。按enter键可以找到该列表中的第一个候选项,反复按enter键可以在列表中循环

我通过从ComboBox派生实现了这个功能-我认为这是有意义的,因为我仍然保留一个ComboBox,它只是添加了这个“快速查找”功能。然而,创建候选列表并在其中循环的逻辑虽然简单,但并不完全是琐碎的,并且可以进行一些测试

然而,正如我们所看到的,仅仅通过构造组合框并推动我添加的额外例程来测试组合框似乎并不那么容易——它需要存在于表单上,才能以与应用程序中相同的方式运行。要测试一个简单的组合框中的一个简单添加项,这似乎太费劲了

但是,代码中没有任何内容是针对我的应用程序的,我创建了一个通用控件,可以在任意数量的上下文中使用,唯一的要求是combobox中的对象具有ToString()methiod,这与对进入普通combobox的对象的限制相同,并由C#NET提供担保


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

与您参考的文章一样:将逻辑与gui元素分离也是这里的解决方案

你应该考虑使用一个类控制器,它公开了一个项目列表,你可以将这些数据列表映射到组合框的数据源。控制器本身负责维护此列表

因此,无论何时在组合框中键入字母,都要调用控制器上的函数,比如UpdateList(string typedString)。通过这种方式,您已经分离了用“候选者”填充列表的逻辑


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

我想我在昨天的帖子中已经讲清楚了:为了能够为此编写单元测试,您需要分离GUI控件和逻辑。如果您还有任何问题,请提问:)谢谢Gerrie-与您之前的回答相比,这里的点击效果更好!但是,我如何知道我已经将UpdateList调用连接到了正确的事件中?我是否需要让这部分逻辑变得足够简单,以便进行检查?我不完全理解你的问题,但你想测试填写候选人名单背后的逻辑,对吗?因此,现在请忘记将事件关联到UpdateList方法。如何使用该方法是另一回事,在您的情况下,它将由ComboBox事件触发,并在您的测试中触发。也许我的单元测试哲学是错误的。我可以将“候选列表”隔离到它自己的类中,但是如何测试“当我按下Enter键时,将显示下一个候选”要求?当然,我可以测试“当我调用f()时,下一个候选者被请求”并且我可以得到“当我点击Enter时,f()”。。。被称为“仅通过目视检查。Windows窗体中的键处理是“困难的”-我不知道如何确保已重写正确的方法/连接到正确的事件。当我不确定时,我通常使用测试,但似乎无法编写足够的测试。