【问题标题】:How to unit test a console program that reads input and writes to the console [closed]如何对读取输入并写入控制台的控制台程序进行单元测试[关闭]
【发布时间】:2017-08-26 22:01:00
【问题描述】:

假设我有一个简单的程序,比如

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 的情况下做到这一点?

【问题讨论】:

  • "没有实际使用解决方案中的 .exe?" -- 这是什么意思?你将如何测试 .exe 中的代码而不以 some 方式使用 .exe?我可以想到至少两种测试代码的方法,但都涉及使用代码。我不知道您如何在不使用代码的情况下测试代码,因此您需要更加具体和清楚您的意思。当然,请注意,即使您的问题是可以理解的,它也太宽泛了,几乎任何“可能吗?”问题是。您需要尝试一些事情,并在遇到困难时提出问题。
  • 是的,如果您使用 TypeMock 隔离器或 Microsoft Fakes,则可以。假货如果你有企业版的VS,很乐意提供解决方案

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


【解决方案1】:

将完成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() 在所有情况下都按预期执行。

【讨论】:

  • 哈。你打败了我。很好的答案。
  • @JordanS.Jones 经常发生在我身上! :) 谢谢。
  • 我尝试了这种方法,但我面临的问题是控制台窗口根本不显示。所以,我什么都输入不了……
  • @MelbourneDeveloper 这个例子是针对控制台应用程序的——至于单元测试,不涉及Console(将其分离成InputConverter的意义)
  • 本世纪的额头拍板。感谢您指出显而易见的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
  • 2019-08-17
  • 1970-01-01
相关资源
最近更新 更多