以编程方式触发 UI 事件以进行单元测试
Programmatically fire UI event for unit testing
我正在 visual studio express 中开发一个 winforms 项目,该项目涉及单击树视图的不同节点以显示不同的表单,我通过为 AfterSelect 事件创建处理程序来处理这些问题。由于我没有 VS Ultimate 或 Premium,我无法使用编码 UI 测试。为了对此进行单元测试,我尝试以编程方式更改树视图的选定节点,如下所示
treeview1.SelectedNode = Nodes[0].Nodes[1]
并检查根据所选节点切换的标签文本。
afterSelect 事件似乎没有触发,我试过给树视图焦点,我试过调用 .Select()
,我试过设置 HideSelection
属性 到 false
。我已经查看过这里和其他网站,这些是迄今为止对我的情况似乎可行的唯一建议。
我想知道我需要做什么才能让 AfterSelect 事件在单元测试中触发?
您尝试做的并不是真正的单元测试,这才是问题的核心。您应该测试一个独立的代码单元,但在这里您对 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);
我正在 visual studio express 中开发一个 winforms 项目,该项目涉及单击树视图的不同节点以显示不同的表单,我通过为 AfterSelect 事件创建处理程序来处理这些问题。由于我没有 VS Ultimate 或 Premium,我无法使用编码 UI 测试。为了对此进行单元测试,我尝试以编程方式更改树视图的选定节点,如下所示
treeview1.SelectedNode = Nodes[0].Nodes[1]
并检查根据所选节点切换的标签文本。
afterSelect 事件似乎没有触发,我试过给树视图焦点,我试过调用 .Select()
,我试过设置 HideSelection
属性 到 false
。我已经查看过这里和其他网站,这些是迄今为止对我的情况似乎可行的唯一建议。
我想知道我需要做什么才能让 AfterSelect 事件在单元测试中触发?
您尝试做的并不是真正的单元测试,这才是问题的核心。您应该测试一个独立的代码单元,但在这里您对 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);