首页 > 解决方案 > 如何为具有 console.writeline 的代码编写 MS 单元测试

问题描述

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

标签: c#mstest

解决方案


如果你真的想测试Concole.WriteLine调用,我会创建一个带有接口的类来封装Console.WriteLine. 可以是这个样子。

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

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

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

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


推荐阅读