我正在 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/