如何为 console.writeline 的代码编写 MS 单元测试

How to write MS Unit Test for the code having console.writeline

我正在使用冒泡排序对数组进行降序排序并在 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          
}

如果你真的想测试 Concole.WriteLine 调用,我会创建一个 class 和一个接口来封装 Console.WriteLine。可能看起来像这样。

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

然后您可以在您的 PrintData 方法中使用此服务并在您的测试中模拟调用并验证调用;例如最小起订量。

更简单的方法是 return 来自 PrintData 的列表并将每个条目添加到列表而不是 Console.WriteLine(input[i]);,因为这样您就可以测试添加的值是否正确。在您的应用程序中,您只需使用 for each 循环打印所有条目。

因此您必须更改代码以使其可测试。但是在此之后您的代码会更清晰(我几乎不建议不要在逻辑 classes 中使用任何 UI 交互)。关于测试如何使代码更简洁的好例子 ;)

您可以在您的方法中添加一个 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());