TDD с DataGridView - PullRequest
       19

TDD с DataGridView

0 голосов
/ 15 сентября 2009

Я относительно новичок в TDD и все еще пытаюсь научиться применять некоторые концепции. Вот моя ситуация.

У меня есть WinForm с DataGridView. Я пытаюсь написать тест для подпрограммы, вызываемой нажатием кнопки, которая будет выполнять некоторые операции с выбранными строками сетки. Поэтому я буду передавать объект DataGridViewSelectedRowCollection (т.е. свойство dgv.SelectedRows в момент нажатия кнопки).

Объект DataGridViewSelectedRowCollection не имеет конструктора, поэтому я могу понять, как его создать, - собрать DataGridView в моем тестовом проекте, затем выбрать несколько строк и передать свойство SelectedRows. Но ясно, что я не хочу воссоздавать целую форму там.

Итак, я делаю DataGridView dgv = new DataGridView () и генерирую BindingList (на самом деле это SortableBindingList) точно так же, как сетка привязана в реальном приложении. Список тестов состоит из 3 строк. И я делаю dgv.DataSource = myList.

Теперь, в этой точке реального приложения, вид сетки привязан. Если я смотрю на dgv.Rows.Count, он равен количеству строк в списке. Однако в моем тесте установка свойства DataSource в список по-прежнему приводит к нулю строк в сетке.

Я думаю, что в создании вида сетки чего-то не хватает, что обычно делается при добавлении его в контрольный список формы. Вероятно, он инициализирует обработчик для события 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");

Спасибо за любую помощь, которую вы можете оказать мне.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2009

Что ж, я решил проблему и в значительной степени подтвердил, что это делается при инициализации элемента управления при добавлении в форму, что делает привязку DataSource работать.

Внезапно меня осенило, что «цель», созданная средой тестирования MS, является частным средством доступа к самой Форме. Поэтому я изменил линию DataGridView остатокGrid = новый DataGridView (); в приведенном выше коде вместо того, чтобы создавать новый объект DGV, просто обратитесь к объекту в целевой форме: DataGridView остатокGrid = target.residueGrid;

Это изменение заставило все работать как положено.

0 голосов
/ 15 сентября 2009
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 - это место, где вы устанавливаете источник данных вида сетки, а Assert - это место, где вы проверяете, что все прошло нормально. Я обычно пишу эти три строки комментариев каждый раз, когда начинаю писать тест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...