如何:通过控制台捕获void方法的输出?

时间:2018-04-29 00:48:44

标签: c# unit-testing console-application readline prime-factoring

我正在编写一个素数程序的测试用例。我正在尝试将PrimeEvaluator方法的输出与我的expectedFactors1字符串进行比较。 PrimeEvaluator void ,这就是我尝试从控制台读取输出的原因。

public void PrimeTest()
{
    //arange
    int number = 738;
    string expectedFactors1 = "2,3,3,41";
    string actual;

    //act
    Primes.Program.PrimeEvaluator( number);
    actual = Console.ReadLine();

    //assert
    Assert.AreEqual(expectedFactors1,actual);           
}

当我运行我的单元测试时,没有任何反应。我知道这可能是错的,但有人可以给我一些关于如何从PrimeEvaluator捕获数字输出的见解吗?

2 个答案:

答案 0 :(得分:2)

在这种特殊情况下,您可以使用Console.Out来点击Console.SetOut()来拦截写入的内容。

public void PrimeTest() {        
    //stream and writer used to intercept console output
    using(var memoryStream = new MemoryStream()) {
        var writer = new StreamWriter(memoryStream);
        Console.SetOut(writer);

        //Arrange
        int number = 738;
        string expectedFactors1 = "2, 3, 3, 41";

        //Act
        Primes.Program.PrimeEvaluator(number);

        //Assert
        memoryStream.Position = 0; //reset position to read stream
        string actual = new StreamReader(memoryStream).ReadToEnd();
        Assert.AreEqual(expectedFactors1, actual);
    }
}

答案 1 :(得分:1)

只需让PrimeEvaluator方法返回一个整数列表。然后你可以比较输出而不必解析控制台,这绝不是一个好主意。以下是如何更改返回整数列表的方法:

private static List<int> PrimeEvaluator(int number)
    {
        var result = new List<int>();

        // Take out the 2s
        while (number % 2 == 0)
        {
            result.Add(2);

            number /= 2;
        }

        // take out other primes
        int factor = 3;

        while (factor * factor <= number)
        {
            if (number % factor == 0)
            {
                result.Add(factor);

                number /= factor;
            }
            else
                factor += 2;
        }

        // if num is not 1, then whatever is left is prime.
        if (number > 1) result.Add(number);

        return result;
    }

然后在你的单元测试中调用它(你有两种方法可以比较):

List<int> primeFactorsList = PrimeEvaluator(738); // list variant
string primeFactorsString = string.Join(", ", primeFactorsList); // string variant

返回一个包含4个整数的列表:2,3,3,41

现在您的代码可以在库中重用,无需依赖于控制台输出来获得答案。

另外,请查看.Net中的System.Math代码,了解Microsoft如何实现可用的数学运算,源代码可用:System.Math