我正在回答你自己的问题时写这个问题,因为我找到了问题的解决方案,但是如果有人有更好的解决方案,我很乐意听取它。
在我正在处理的应用程序中,我正在继承ListView控件,以添加一些与ListView SelectedIndices和SelectedItems属性交互的功能。
问题在于,当我尝试对子类进行单元测试时,当我向选择中添加项时,SelectedIndices和SelectedItems属性不会更新。我试过了两个
item.Selected = true
和
listView.SelectedIndices.Add(...)
但SelectedIndices或SelectedItems似乎没有受到影响。对功能其他部分的单元测试工作正常。
如何对ListView子类的选择依赖部分进行单元测试?
答案 0 :(得分:8)
我发现了一个可以用来填充这些属性的技巧:
listView.AccessibilityObject.ToString(); //解决方法以刷新选定项属性
答案 1 :(得分:7)
问题似乎是如果未绘制ListView,则SelectedIndices和SelectedItems无法正确更新,如ListViewItem.Selected property的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);
}
}
答案 2 :(得分:2)
我发现在ListView对象上调用.CreateControl()会刷新SelectedItems属性。
答案 3 :(得分:0)
“我发现在ListView对象上调用.CreateControl()会刷新SelectedItems属性。”
是的,但是只有你也使用Multi-select。