c# - 如何为具有 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
}
解决方案
如果你真的想测试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 交互)。关于测试如何使代码更清洁的好例子;)
推荐阅读
- python - isin、str.contains 和 if 条件之间的区别?
- laravel - 我想用 Laravel 6 创建一个登录页面,在同一服务器中的 Laravel 和 Codeigniter 程序之间共享登录信息
- android - 如何使用 AlertDialog 设置多种类型?
- elasticsearch - elasticsearch无痛数组第一个元素
- css - 防止在网格布局中将换行符复制到剪贴板
- java - 将自定义依赖项添加到spring项目后缺少类
- git - 为每个分支设置拉取请求合并选项
- spring-mvc - 如何在不同的 html 页面之间共享一个 WebSocket 连接?
- javascript - 嵌套循环忽略其他元素
- xml - 将 XML 字符串转换为 scala XML 文字