如何单元测试的控制台程序,读取输入和写入控制台
比方说,我有一个像如何单元测试的控制台程序,读取输入和写入控制台
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,可以这样做吗?
此举确实在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()
按预期执行所有情况。
Ha。你击败了我。很好的答案。 –
@ JordanS.Jones经常发生在我身上! :) 谢谢。 – trashr0x
_“没有实际使用解决方案中的.exe”_ - 这是什么意思?你如何测试.exe中的代码,而不用_some_方式使用.exe?我可以考虑至少有两种方法来测试代码,但都涉及使用代码。我不知道如何在不使用它的情况下测试代码,所以你需要更具体和明确你的意思。当然,注意到即使你的问题是可以理解的,它也会太宽泛,几乎没有“可能吗?”问题是。你需要找点东西,当你被困时提问。 –
是的,如果你使用TypeMock隔离器或微软假货是可能的。对于假货如果你有企业版的VS,很乐意提供解决方案 – zaitsman