【问题标题】:Programmatically fire UI event for unit testing以编程方式触发 UI 事件以进行单元测试
【发布时间】:2015-10-09 20:19:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能提供你的单元测试的代码和你正在测试的方法吗?我认为这将有助于我们直观地了解您要完成的工作。
  • 我可以把单元测试方法放在这里,但是我测试的方法很大。不过,我可以让您快速了解正在发生的事情。单元测试正在检查标签的文本是否正在更改。在我处理 AfterSelect 事件的原始源代码中,我使用 this.label1.text = e.Node.Text 它的默认文本是 label1,Nodes[0].Nodes[1] 是“Power”。所以对于单元测试,我在主窗体中使用声明 Assert.AreEqual("Power", label1.Text); label1 是私有的,我使用我在主窗体的源代码中定义的属性访问它
  • 您使用的是 Moq 还是其他模拟框架?

标签: c# winforms unit-testing events treeview


【解决方案1】:

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

要将逻辑从 UI 中分离出来作为其输出,请创建一个接口,例如:

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

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

  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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多