Как написать MS Unit Test для кода, имеющего console.writeline - PullRequest
0 голосов
/ 04 апреля 2019

Я использую пузырьковую сортировку для сортировки массива в порядке убывания и печати результатов в методе console.writeline, теперь я запутался, как написать модульный тест для проверки на console.writeline

//Console Application Code
public int PrintData(int[] input, int n)
{
    for (int i = 0; i < n; i++)
    {
        if (input[i] <= 0)
        {
            status = -2;
        }
        else
        {
            for (int j = i + 1; j < n; j++)
            {
                if (input[i] < input[j])
                {
                    int temp = input[i];
                    input[i] = input[j];
                    input[j] = temp;
                }
            }
        }
    }

    for (int i = 0; i < n; i++)
    {
        Console.WriteLine(input[i]); //How to check this output in MSTest
    }
}

//MS Test Code
[TestMethod]        
public void ArrayDisplayingInDescendingOrder()
{
    int[] arr = new int[5] { 3, 2, 1, 4, 5 };
    int[] expected = { 5, 4, 3, 2, 1 };            
    array.PrintData(arr, 5); 
    //What i should do here          
}

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Если вы действительно хотите протестировать вызовы Concole.WriteLine, я бы создал класс с интерфейсом для инкапсуляции Console.WriteLine.Может выглядеть так.

public class ConsoleService : IConsoleService
{
    public void WriteToConsole(string text)
    {
        Console.WriteLine(text);
    }
}

Тогда вы можете использовать эту службу в своем методе PrintData, а также проверять вызовы в своем тесте и проверять вызовы;например, с Moq.

Проще было бы вернуть список из PrintData и добавить каждую запись в список вместо Console.WriteLine(input[i]);, потому что тогда вы можете проверить, были ли добавлены правильные значения.А в вашем приложении вы можете просто напечатать все записи с каждым циклом.

Таким образом, вы должны изменить свой код, чтобы сделать его тестируемым.Но после этого ваш код станет чище (вряд ли я бы рекомендовал не использовать взаимодействие с пользовательским интерфейсом в логических классах).Хороший пример того, как тесты тоже могут сделать код чище;)

0 голосов
/ 04 апреля 2019

Вы можете добавить TextWriter аргумент к вашему методу и использовать его для записи:

public int PrintData(int[] input, int n, TextWriter sw)
{
    ...
    sw.WriteLine(input[i]);
}

Когда вы вызываете метод, вы можете затем указать любой TextWriter, включая Console.Out илизаглушка:

PrintData(new int[0], 0, Console.Out); //writes to the console

//in unit test:
TextWriter tw = new StringWriter();
PrintData(new int[0], 0, tw); //writes to tw
Assert.AreEqual("...", tw.ToString());
...