Vacate Ответов: 1

Модульное тестирование моего проекта


[TestClass()]
 public class UnitTest
 {
     [TestMethod()]
     public void BindDataCSV_FilePathIsEmpty()
     {
         // Arrange
         var sut = new Woodstocks();
         // Act
         var result = sut.BindDataCSV(string.Empty);
         //Assert
         Assert.Equals(0, result.Rows.length);
     }
 }


Что я уже пробовал:

Привет, ребята, я пытаюсь модульно протестировать свою функцию BindDataCSV, чтобы увидеть, будет ли она возвращать нулевой или пустой DataTable. Ошибка, которую я получаю, заключается в том, что я не могу назначить void неявно типизированной переменной.
Я понимаю, что это очень новичковый вопрос, но любая помощь будет оценена по достоинству.

Richard MacCutchan

Вы не можете приписать "пустоту" чему-либо, поскольку она не имеет никакого значения. Вам нужно показать код, который выдает ошибку.

F-ES Sitecore

Вы можете увидеть код из его другого потока, где я уже сказал ему, что его код не поддается модульному тестированию.

https://www.codeproject.com/Questions/1265657/How-do-I-unit-test-my-code

Richard MacCutchan

Да, трудно уследить за всеми повторяющимися вопросами.

Vacate

Большое спасибо, вы, ребята, действительно помогли мне и смогли выразить это достаточно просто, чтобы я полностью понял. Овации

1 Ответов

Рейтинг:
1

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