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

时间:2019-04-04 11:52:36

标签: c# mstest

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

答案 0 :(得分:1)

如果您真的想测试Concole.WriteLine调用,我将创建一个带有用于封装Console.WriteLine的接口的类。可能看起来像这样。

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

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

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

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

答案 1 :(得分:0)

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