首页 > 解决方案 > 如何:通过控制台捕获 void 方法的输出?

问题描述

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

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吗?

标签: c#unit-testingconsole-applicationreadlineprime-factoring

解决方案


在这种特殊情况下,您可以利用Console.OutusingConsole.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);
    }
}

推荐阅读