为什么在unit testing中实例化ListView时SelectedIndices和SelectedItems不起作用?

我正在回答你自己的问题时写这个问题,因为我找到了问题的解决方案,但如果有人有更好的解决方案,我很乐意听。

在我正在处理的应用程序中,我正在inheritanceListView控件以添加一些function,其中一些function与ListView SelectedIndices和SelectedItems属性进行交互。

问题是,当我尝试对子类进行unit testing时,当我向选择中添加项时,SelectedIndices和SelectedItems属性不会更新。 我试过了两个

item.Selected = true 

 listView.SelectedIndices.Add(...) 

但SelectedIndices或SelectedItems似乎并未受到影响。 unit testingfunction的其他部分工作正常。

如何对ListView子类的选择依赖部分进行unit testing?

我发现了一个可以用来填充这些属性的技巧:

listView.AccessibilityObject.ToString(); //解决方法以刷新selecteditems属性

问题似乎是如果未绘制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); } } 

我发现在ListView对象上调用.CreateControl()会刷新SelectedItems属性。

“我发现在ListView对象上调用.CreateControl()会刷新SelectedItems属性。”

是的,但是只有你也使用Multi-select。