c# - 以编程方式触发 UI 事件以进行单元测试

标签 c# winforms unit-testing events treeview

我正在 Visual Studio Express 中开发一个 winforms 项目,该项目涉及单击 TreeView 的不同节点以显示不同的表单,我通过为 AfterSelect 事件创建处理程序来处理该项目。由于我没有 VS Ultimate 或 Premium,因此无法使用编码的 UI 测试。为了对此进行单元测试,我尝试以编程方式更改 TreeView 的选定节点,如下所示

treeview1.SelectedNode = Nodes[0].Nodes[1] 并检查根据所选节点切换的标签文本。

afterSelect 事件似乎没有触发,我尝试给予 TreeView 焦点,我尝试调用 .Select(),并且我尝试设置 HideSelection 属性设置为 false。我查看过这里和其他网站,这些是迄今为止唯一对我的情况可行的建议。

我想知道我需要做什么才能让 AfterSelect 事件在单元测试中触发?

最佳答案

您想要做的并不是真正的单元测试,这才是问题的核心。您应该测试一个独立的代码单元,但在这里您对 UI (它既是输入又是输出)有很强的依赖性。 您应该将逻辑与 UI 分开,并独立测试逻辑。

要将逻辑与 UI 作为其输出分开,请创建一个界面,例如:

  public interface ITreeUIOutput
  {
      void ChangeLabel(string nodeName, string text);
  }

然后你的逻辑代码就会有一个钩子(Hook)供UI用作输入,它会调用输出接口(interface):

  public class TreeModifier
  {
       private ITreeUIOutput _ui;

       public TreeModifier(ITreeUIOutput ui)
       {
            _ui = ui;
       }

       public void AfterSelect(string nodeName, string nodeText)
       {
            _ui.ChangeLabel(nodeName, nodeText + "New");
       }
  }

一旦代码被分离,您就可以使用模拟库(如 Moq)来测试您的逻辑:

 Mock<ITreeUIOutput> uiMock = new Mock<ITreeUIOutput>();
 string nodeName = "MyNode";
 string nodeText = "MyText";

 TreeModifier tree = new TreeModifier(uiMock.Object);
 tree.AfterSelect(nodeName, nodeText);

 //Here we test that ChangeLabel was called once (and only once) with the correct parameters, meaning our logic worked!
 uiMock.Verify(c => c.ChangeLabel(nodeName, nodeText + "New"), Times.Once);

关于c# - 以编程方式触发 UI 事件以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31521093/

相关文章:

unit-testing - 是否有更快的 MS Test Runner

c# - 将实体添加到 Stanford NLP NER 分类器

c# - 单击红色 X 时让应用程序停止 C#

c# - 使用 C# .net 检测进程已在 Windows 中运行

c# - 如何查看文件夹内的文件名

unit-testing - 在升级到JDK 8后,为什么我的Spock单元测试在Gradle构建中失败?

c++ - 如何将字符串中的数据放入cin

c# - 跨语言共享环境变量

c# - CommandConverter 无法从 WPF 中的 System.String 转换

vb.net - 如何禁用DataGridView中的选择列