F-ES Sitecore
Чтобы ответить на ваш непосредственный вопрос, BindDataCSV ничего не возвращает (он имеет "void" в качестве возвращаемого типа), поэтому вы не можете присвоить его возвращаемое значение переменной, так как возвращать нечего.
Чтобы вернуться к моим комментариям в вашей другой теме, этот код не тестируется сам по себе. Вам нужно извлечь биты, которые можно протестировать, в их собственный класс\функции. Поэтому я бы сделал что-то вроде изменения BindDataCSV на;
private void BindDataCSV(string filePath)
{
string[] lines = System.IO.File.ReadAllLines(filePath);
DataTable dt = GetDataTable(lines);
if (dt.Rows.Count > 0)
{
dataGridView1.DataSource = dt;
}
}
Ваши модульные тесты не должны иметь доступа к каким-либо внешним ресурсам, таким как файловая система, и в идеале они также не должны иметь доступа к элементам графического интерфейса, поскольку модульные тесты должны запускаться автоматически в любом контексте без каких-либо зависимостей. Таким образом, обновленная функция извлекает важную логику в новую функцию (GetDataTable) и делает все то, что вы не можете модульно протестировать, например, доступ к файлам, обновление сетки данных и т. д.
Функция GetDataTable выглядит следующим образом;
public DataTable GetDataTable(string[] lines)
{
DataTable dt = new DataTable();
if (lines.Length > 0)
{
//first line to create header
string firstline = lines[0];
//reads first line of string array at index 0
string[] headerLabels = firstline.Split(',');
//splits the firstline using comma delimited string
foreach (string headerWord in headerLabels)
{
dt.Columns.Add(new DataColumn(headerWord));
//added DataColumns for header
}
//for data
for (int r = 1; r < lines.Length; r++)
{
string[] dataWords = lines[r].Split(',');
//split strings into lines
DataRow dr = dt.NewRow();
//inset a new row into a data table
int columnIndex = 0;
//start of column is 0 index
foreach (string headerWord in headerLabels)
{
dr[headerWord] = dataWords[columnIndex++];
//increment the value by 1 in columnIndex
}
dt.Rows.Add(dr);
//adds DataRow in the DataTable
}
}
return dt;
}
Эта функция работает с массивом строк и не имеет доступа к графическому интерфейсу или чему-либо еще, так что теперь это можно проверить. Я написал несколько модульных тестов ниже, но это до вас, чтобы решить все, что вы хотите проверить.
[TestClass]
public class UnitTest1
{
[TestMethod]
public void GetDataTable_ColumnsAreLoaded()
{
// Arrange
Form1 form1 = new Form1();
string[] lines = new string[] { "Col A, Col B", "Row 1 A, Row 1 B" };
// Act
DataTable dt = form1.GetDataTable(lines);
// Assert
Assert.AreEqual(2, dt.Columns.Count);
}
[TestMethod]
public void GetDataTable_ColumnsAreCorrect()
{
// Arrange
Form1 form1 = new Form1();
string[] lines = new string[] { "Col A, Col B", "Row 1 A, Row 1 B" };
// Act
DataTable dt = form1.GetDataTable(lines);
// Assert
Assert.AreEqual("Col A", dt.Columns[0].Caption);
Assert.AreEqual("Col B", dt.Columns[1].Caption);
}
[TestMethod]
public void GetDataTable_RowsAreLoaded()
{
// Arrange
Form1 form1 = new Form1();
string[] lines = new string[] { "Col A, Col B", "Row 1 A, Row 1 B" };
// Act
DataTable dt = form1.GetDataTable(lines);
// Assert
Assert.AreEqual(1, dt.Rows.Count);
}
}
Если вы запустите эти тесты, то увидите, что GetDataTable_ColumnsAreCorrect на самом деле терпит неудачу, и он скажет вам, почему. Он ожидал "Col B", но получил "Col B". Обратите внимание на дополнительное пространство перед столбцом, и это происходит потому, что вы не обрезаете имена столбцов в GetDataTable, так что это ошибка, которую ваши модульные тесты уже нашли.
Так вот что такое модульное тестирование, это не способ автоматизации всего вашего процесса, это извлечение важной логики и тестирование только этой логики; я вообще не касаюсь BindDataCSV в своих тестах, вместо этого я тестирую логику. Кроме того, как вы можете видеть выше, не весь ваш код будет модульно тестируемым, если вы не написали его с учетом модульных тестов.