2009-09-14 48 views
0

我對TDD比較陌生,仍然試圖學習應用一些概念。這是我的情況。TDD與DataGridView

我有一個帶有DataGridView的WinForm。我正在嘗試編寫一個測試程序,通過點擊按鈕調用該程序,該程序將對網格的選定行執行一些操作。 所以我將傳入DataGridViewSelectedRowCollection對象(即單擊按鈕時的dgv.SelectedRows屬性)。

DataGridViewSelectedRowCollection對象沒有構造函數,所以我可以創建它的唯一方法是將DataGridView放在我的測試項目中,然後選擇一些行並傳入SelectedRows屬性。但顯然,我不想在那裏重新創建整個表單。

因此,我做了一個DataGridView dgv = new DataGridView(),並且綁定了一個BindingList(實際上是一個SortableBindingList),就像網格在實際應用中綁定一樣。測試列表中有3行。我做了一個dgv.DataSource = myList。

現在,在真正的應用程序中,網格視圖被綁定。如果我查看dgv.Rows.Count,它等於列表中的行數。但是,在我的測試中,將DataSource屬性設置爲列表仍然會導致網格中出現零行。

我想在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"); 

感謝任何幫助,您可以給我。

+0

你想分配數據源 - 填充它(或使用BindingSource).. – stuartd 2009-09-14 22:49:03

+0

謝謝,斯圖爾特,但我填充它後也嘗試過它,以及相同的結果。(事實上​​,那是我第一次嘗試,然後我看了一些先綁定數據源然後填充數據源的例子,所以我嘗試了這種方式,這就是我最終發佈的代碼。使用BindingSources。) 我看到很多使用BindingSources的發佈示例。我試圖避免它有兩個原因:1)我不明白他們。它似乎只是增加了對混音的另一層次的間接/混淆。 2)我測試的代碼不使用綁定源。 – 2009-09-15 13:20:25

回答

0

嗯,我解決了這個問題,並且幾乎證實,當添加到使DataSource綁定工作的窗體時,它在控件的初始化中已經完成。

我突然意識到,MS測試框架創建的「目標」是Form本身的私有訪問者。所以我改了行 DataGridViewresourceGrid = new DataGridView(); ,而不是創建一個新的DGV對象,只需引用目標表單上的一個: DataGridView residueGrid = target.residueGrid;

這種改變使一切按預期工作。

0
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"); 

用於寫入測試的有用結構如下:

public void MyTest() 
{ 
    // Arrange 
    // Act 
    // Assert 
} 

在這種情況下,Arrange將被實例化的所有對象,並填充列表。 Act是您設置gridview的數據源的地方,Assert是您檢查一切正常的地方。每次我開始寫測試時,我通常會寫出這三條評論。

+0

托馬斯,感謝您花時間回覆。 A)我正在使用A/A/A模型。我發佈的代碼都是「排列」步驟的一部分。我只是在那裏宣稱,這樣我就可以確定我的先決條件。 B)我在填充列表後試着用綁定,結果是一樣的。電網沒有受到約束,這是我在這裏問的真正的問題。 – 2009-09-15 13:24:04

+0

我只是重新閱讀了回覆和我的評論,並意識到也許我並不清楚。 所有這些代碼不是我正在測試的。我正在測試一個例程,它會從數據網格中選定的行進行調用。所有這些代碼都是「Arrange」的一部分,用於創建DataGridViewSelectedRowCollection以傳遞給待測試的方法。 – 2009-09-15 14:07:21