我正在回答你自己的问题时写这个问题,因为我找到了问题的解决方案,但如果有人有更好的解决方案,我很乐意听.
在我正在处理的应用程序中,我正在继承ListView控件以添加一些功能,其中一些功能与ListView SelectedIndices和SelectedItems属性进行交互.
问题是,当我尝试对子类进行单元测试时,当我向选择中添加项时,SelectedIndices和SelectedItems属性不会更新.我试过了两个
item.Selected = true
和
listView.SelectedIndices.Add(...)
但SelectedIndices或SelectedItems似乎并未受到影响.单元测试功能的其他部分工作正常.
如何对ListView子类的选择依赖部分进行单元测试?
我发现了一个可以用来填充这些属性的技巧:
listView.AccessibilityObject.ToString(); //解决方法以刷新选定项属性
问题似乎是如果未绘制ListView,则SelectedIndices和SelectedItems无法正确更新,如ListViewItem.Selected属性的MSDN文档中的注释中所述:
如果从未绘制过ListView,则无法信任Selected属性(例如,它位于TabControl中,尚未选中的选项卡中).在这种情况下,父ListView的SelectedItems和SelectedIndices没有正确更新,仍然是空的.
解决此问题的一个方法是在测试中创建一个简单的虚拟表单类,将ListView添加到表单中,然后只显示表单.之后,SelectedIndices和SelectedItems属性按预期工作.
像这样的东西:
[Test] public void CanGetSelectedItems() { // simple test to make sure that the SelectedIndices // property is updated using (var f = new DummyForm(listView)) { f.Show(); listView.SelectedIndices.Add(0); Assert.AreEqual(1, listView.SelectedIndices.Count); } } private class DummyForm : Form { public DummyForm(ListView listView) { // Minimize and make it not appear in taskbar to // avoid flicker etc when running the tests this.WindowState = FormWindowState.Minimized; this.ShowInTaskbar = false; this.Controls.Add(listView); } }