如何为 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());
我正在使用冒泡排序对数组进行降序排序并在 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());