以编程方式触发用于单元测试的UI事件

时间:2015-07-20 15:58:49

标签: c# winforms unit-testing events treeview

我正在开发visual studio express中的winforms项目,该项目涉及单击树视图的不同节点以显示不同的表单,我通过为AfterSelect事件创建处理程序来处理。由于我没有VS Ultimate或Premium,我不能使用编码的UI测试。为了对此进行单元测试,我尝试以编程方式更改树视图的选定节点,如此

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

afterSelect事件似乎没有被触发,我尝试过关注树视图,我尝试调用.Select(),我尝试将HideSelection属性设置为{ {1}}。我看过这里和其他网站,这是迄今为止我认为可行的唯一建议。

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

1 个答案:

答案 0 :(得分:4)

您尝试做的事情并非真正的单元测试,而且这是问题的核心。您应该测试一个独立的代码单元,但在这里您非常依赖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);