Winforms 带有DataGridView的TDD

Winforms 带有DataGridView的TDD,winforms,datagridview,tdd,Winforms,Datagridview,Tdd,我对TDD比较陌生,仍在努力学习应用一些概念。这是我的情况 我有一个带有DataGridView的WinForm。我正在尝试为例程编写一个测试,该例程将通过单击按钮来调用,该按钮将在网格的选定行上执行一些操作。 因此,我将在单击按钮时传入DataGridViewSelectedRowCollection对象,即dgv.SelectedRows属性 DataGridViewSelectedRowCollection对象没有构造函数,因此创建它的唯一方法是在测试项目中组合一个DataGridView

我对TDD比较陌生,仍在努力学习应用一些概念。这是我的情况

我有一个带有DataGridView的WinForm。我正在尝试为例程编写一个测试,该例程将通过单击按钮来调用,该按钮将在网格的选定行上执行一些操作。 因此,我将在单击按钮时传入DataGridViewSelectedRowCollection对象,即dgv.SelectedRows属性

DataGridViewSelectedRowCollection对象没有构造函数,因此创建它的唯一方法是在测试项目中组合一个DataGridView,然后选择一些行并传入SelectedRows属性。但很明显,我不想在那里重新创建整个表单

因此,我做了一个DataGridView dgv=new DataGridView,并创建了一个BindingList,实际上是一个SortableBindingList,就像网格在实际应用程序中绑定到的一样。测试列表中有3行。我做了一个dgv.DataSource=myList

现在,在实际应用程序中,网格视图已绑定。如果查看dgv.Rows.Count,它等于列表中的行数。但是,在我的测试中,将DataSource属性设置为list仍然会导致网格中出现零行

我认为在gridview的创建中缺少了一些东西,当它被添加到表单的控件列表中时,通常会完成这些工作。它可能会初始化OnDataSourceChanged事件或其他事件的处理程序,这在我的测试代码中没有完成,但我真的不知道如何修复它,而不在测试夹具中重新创建整个表单对象

以下是我的测试方法的相关代码:

        DataGridView residueGrid = new DataGridView();
        List<Employee> baseListToGrid = new List<Employee>();
        SortableBindingList<Employee> listToGrid = new SortableBindingList<Employee>(baseListToGrid);
        residueGrid.DataSource = listToGrid;
        for (int ix = 1; ix < 4; ix++)
        {
             listToGrid.Add(ObjectMother.GetEmployee(ix));
        }
        Assert.AreEqual(3, listToGrid.Count, "SortableBindingList does not have correct count");
        Assert.AreEqual(3, residueGrid.Rows.Count, "DataGrid is not bound to list");
谢谢你能给我的任何帮助

DataGridView residueGrid = new DataGridView();
List<Employee> baseListToGrid = new List<Employee>();
SortableBindingList<Employee> listToGrid = new SortableBindingList<Employee>(baseListToGrid);

// residueGrid.DataSource = listToGrid; <-- move this line...

for (int ix = 1; ix < 4; ix++)
{
     listToGrid.Add(ObjectMother.GetEmployee(ix));
}

// residueGrid.DataSource = listToGrid; <-- ...to here!

Assert.AreEqual(3, listToGrid.Count, "SortableBindingList does not have correct count");
Assert.AreEqual(3, residueGrid.Rows.Count, "DataGrid is not bound to list");

在这种情况下,Arrange将实例化所有对象,并填充列表。Act是设置gridview数据源的地方,Assert是检查一切是否正常的地方。每次开始编写测试时,我通常都会写出这三行注释。

好吧,我解决了这个问题,并且基本上确认了,当添加到表单时,控件的初始化过程中正在进行一些操作,从而使数据源绑定工作

我突然意识到,MS测试框架创建的目标是表单本身的私有访问器。所以我改变了路线 DataGridView剩余网格=新DataGridView; 在上面的代码中,不要创建新的DGV对象,只需引用目标窗体上的DGV对象即可: DataGridView residueGrid=target.residueGrid


这一更改使一切都按预期进行。

您希望在填充数据源后分配数据源,或使用BindingSource。。谢谢,斯图尔特,但我在填充数据源后也尝试了,结果相同。事实上,这是我的第一次尝试,然后我看了一些先绑定数据源,然后填充数据源的示例,所以我尝试了这种方式,这就是我最后发布的代码。尽管这些示例确实使用了BindingSources。我确实看到许多使用BindingSources发布的示例。我试图避免它有两个原因:1我不理解它们。这似乎只是增加了另一个层次的间接/混乱。2我正在测试的代码没有使用绑定源代码。Thomas,感谢您花时间回复。A我使用的是A/A/A模式。我发布的代码都是排列步骤的一部分。我只是把这些断言放在那里,这样我就可以确定我的先决条件。B我在填充列表后尝试了绑定,结果是一样的。网格不受约束,这是我在这里要问的真正问题。我只是重新阅读了回复和我的评论,意识到也许我不清楚。所有这些代码不是我正在测试的。我正在测试一个例程,该例程使用datagrid中选定的行进行调用。所有这些代码都是Arrange创建DataGridViewSelectedRowCollection的一部分,该集合将传递给测试中的方法。
public void MyTest()
{
    // Arrange
    // Act
    // Assert
}