如何对读取输入和写入控制台的控制台程序进行单元测试

时间:2017-04-01 19:06:35

标签: c# .net visual-studio unit-testing

假设我有一个像

这样的简单程序
using System;

public class Solution
{
    public static void Main(string[] args)
    {
        int[] arr = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);
        Array.Sort(arr);
        Console.WriteLine(string.Join(" ", arr));
    }
}

我想在一个单独的项目中测试,比如

[TestMethod]
public void TwoNumbersDescendingAreSwapped()
{
     string input = "2 1";
     string expectedOutput = "1 2"; 
     // ... ???
     Assert.AreEqual(expectedOutput, actualOutput);
}

是否可以在不使用解决方案中的.exe的情况下执行此操作?

1 个答案:

答案 0 :(得分:9)

将执行Main()所有工作的代码移动到它自己的类和方法中:

public static class InputConverter
{
    public static string ConvertInput(string input)
    {
        int[] arr = Array.ConvertAll(input.Split(' '), int.Parse);
        Array.Sort(arr);
        return string.Join(" ", arr);        
    }
}

您的Main()随后变为:

public static void Main(string[] args)
{
    var input = Console.ReadLine();
    var output = InputConverter.ConvertInput(input);
    Console.WriteLine(output);
}

您现在可以在不依赖ConvertInput()的写入和读取功能的情况下测试Console

[TestMethod]
public void TwoNumbersDescendingAreSwapped()
{
    // Arrange
    var input = "2 1";
    var expectedOutput = "1 2"; 
    // Act
    var actualOutput = InputConverter.ConvertInput(input);
    // Assert
    Assert.AreEqual(expectedOutput, actualOutput);
}

顺便说一下:你传递参数的方式似乎就像保证输入总是符合你的期望。当用户传入与整数的字符串表示完全不同的内容时会发生什么?您需要在InputConverter.ConvertInput()中验证输入并根据该输入创建适当的操作过程(抛出Exception,返回null,取决于您之后的内容)。然后,您必须对这些方案进行单元测试,以确保ConvertInput()按预期执行所有情况。