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