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

问题描述:

比方说,我有一个像如何单元测试的控制台程序,读取输入和写入控制台

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

_“没有实际使用解决方案中的.exe”_ - 这是什么意思?你如何测试.exe中的代码,而不用_some_方式使用.exe?我可以考虑至少有两种方法来测试代码,但都涉及使用代码。我不知道如何在不使用它的情况下测试代码,所以你需要更具体和明确你的意思。当然,注意到即使你的问题是可以理解的,它也会太宽泛,几乎没有“可能吗?”问题是。你需要找点东西,当你被困时提问。 –

+0

是的,如果你使用TypeMock隔离器或微软假货是可能的。对于假货如果你有企业版的VS,很乐意提供解决方案 – zaitsman

此举确实在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()按预期执行所有情况。

+0

Ha。你击败了我。很好的答案。 –

+0

@ JordanS.Jones经常发生在我身上! :) 谢谢。 – trashr0x