Как: захватить вывод из метода void через консоль? - PullRequest
0 голосов
/ 29 апреля 2018

Я пишу тестовый пример для программы простых чисел. Я пытаюсь сравнить вывод моего 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 голосов
/ 29 апреля 2018

В этом конкретном случае вы можете нажать на 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);
    }
}
0 голосов
/ 29 апреля 2018

Просто заставьте ваш метод 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;
    }

А затем вызвать это в вашем модульном тесте (у вас есть 2 способа сравнения):

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

, который возвращает список с 4-мя значениями: 2, 3, 3, 41

Теперь ваш код можно повторно использовать в библиотеке, не нужно зависеть от вывода консоли для ответа.

Обратите внимание на код System.Math в .Net, чтобы увидеть, как Microsoft реализует доступные математические операции. Доступен исходный код: System.Math

...