
Firing UI control events from a Unit Test作为TDD的初学者,我正在尝试编写一个假定属性在PropertyGrid(C#,WinForms,.NET 3.5)上更改了属性值的测试。 在属性网格中的对象上更改属性不会触发该事件(这很公平,因为它是UI引发的事件,所以我可以看到为什么更改拥有的对象可能对其不可见)。 当更改SelectedNode属性时,在TreeView上触发AfterSelect也会遇到相同的问题。 我可以有一个函数,我的单元测试可以调用该函数来模拟UI事件将触发的代码,但这会使我的代码混乱不堪,除非我将其公开,否则我必须将所有测试写在我正在测试的对象的相同项目,甚至是类(同样,我认为这很混乱)。在我看来,这很丑陋,并且会遇到可维护性问题。 是否有约定进行此类基于UI的单元测试 要对代码进行单元测试,您将需要模拟UI界面元素的对象。您可以使用许多工具来执行此操作,因此我不推荐一个。我在菲尔·哈克(Phil Haack)的博客中对MoQ和Rhino Mocks有很好的比较,我发现它很有用,也许对您有用。 如果您正在使用TDD,则要考虑的另一件事是创建视图的接口,这将有助于TDD流程。为此有一个设计模型(可能不止一个,但我使用的是一个模型)称为Model View Presenter(现在分为Passive View和Supervisor Controller)。遵循其中之一将使您后面的代码将来更可测试。 此外,请记住,不能通过单元测试来完成对UI本身的测试。另一个答案中已经建议的测试自动化工具将适用于此,但不适用于代码的单元测试。 Microsoft在.Net Framework中内置了UI自动化。您可能可以使用它来模拟以正常方式使用您的软件的用户。 有MSDN文章"使用UI自动化进行自动测试,这是一个很好的起点。 我推荐的一个简单选择是让您的UI在事件触发时调用帮助程序类或方法并对该单元进行测试。确保它(您的UI中的事件处理程序)具有尽可能少的逻辑,然后从那里确定您将要做什么。 在单元测试中很难达到100%的覆盖率。当然,我很难说的是效率低下。我认为,即使您擅长于这种事情,它也可能会给代码库增加比单元测试值得的复杂性。如果不确定如何将逻辑划分为单独的类或方法,这是我想帮助的另一个问题。 我将很感兴趣地看到人们需要使用其他哪些技术来解决此类问题。 |