为什么在单元测试中实例化ListView时SelectedIndices和SelectedItems不起作用?

时间:2008-11-20 10:11:21

标签: c# .net winforms unit-testing listview

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

在我正在处理的应用程序中,我正在继承ListView控件,以添加一些与ListView SelectedIndices和SelectedItems属性交互的功能。

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

item.Selected = true

listView.SelectedIndices.Add(...)

但SelectedIndices或SelectedItems似乎没有受到影响。对功能其他部分的单元测试工作正常。

如何对ListView子类的选择依赖部分进行单元测试?

4 个答案:

答案 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。