c# - 测试 WinForms 用户控件 - 子控件保持隐藏状态

标签 c# winforms unit-testing testing user-controls

我正在用 C# 编写一个 WinForms 用户控件并想对其进行测试(不是 TDD,我首先编写组件并使其运行,但我有点厌倦了总是发现错误,所以我现在想要测试)。我的问题是我无法使子控件(弹出菜单)在测试期间变得可见。 (我意识到它不会出现 - 我不希望它出现,但我仍然想验证它在正常运行时出现。)

相关测试代码如下:

  updater.Raise(it => it.StateChanged += null, AutoUpdaterState.Ok);

[注意:以上是将引发事件的 Moq 代码;它有效,只需忽略细节并认为“引发了将导致菜单变得可见的事件”。]

  Assert.IsTrue(sut.checkToolStripMenuItem.Visible);

控件中的相关代码如下:

      checkToolStripMenuItem.Visible = true;

问题是...我在这一行放置了一个断点,运行后 Visible 保持为 false。我知道这可能是因为我正在测试它,而菜单实际上并没有变得可见...这没关系,但我该如何测试呢?

最佳答案

在测试 UI 代码时,如果使用某种 MVC 模式(例如 WinForms 的 MVP)正确构建它通常会简单得多(如果您还没有这样做的话)。

编写这些测试时,您甚至不应该在测试项目中引用 WinForms。我通常在 View 上有一个方法,对于您的示例,它是 ShowPopupMenu()。我测试的是在某些情况下presenter会调用这个方法。具体的方法我不测试,因为我把这些简单的东西留给了UI,反正99%的逻辑都在presenter里;并显示弹出菜单需要一行代码...

但是,如果您没有 MVP,有一些库可以帮助您测试 WinForms,例如 NUnitForms .

关于c# - 测试 WinForms 用户控件 - 子控件保持隐藏状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6592072/

相关文章:

c# - 如何实现根据传递的类型返回对象的方法

c# - .NET Reflector 和 getters/setters 问题

c# - 将自定义对象绑定(bind)到 DataGrid

c# - 如何在当前组合框中选择一个值时使另一个组合框可见?

Java - 需要有关如何对此类进行单元测试的建议

node.js - 单元测试快速应用程序

c# - 设置额外的哈希算法

c# - 如何在不实例化另一个类的情况下引用该方法?

c# - 带有不可编辑文字(标签)的文本框

android - 使用 Retrofit 测试 MVP Android