Результаты двух методов тестирования представлены в одном утверждении после манипуляций с Console.Out.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Результаты двух методов тестирования представлены в одном утверждении после манипуляций с Console.Out.

Сообщение Anonymous »

Я начинаю изучать программирование и пишу простые алгоритмические упражнения. Я слышал, что кодирование модульных тестов — хорошая практика. Однако я столкнулся с проблемой с функцией, с которой я не знаком. Я хотел перехватить вывод консоли и использовать его в утверждении.
Это функция, которую я тестирую:

Код: Выделить всё

        public static void MinMaxSum(List arr)
{
long minSum = long.MaxValue;
long maxSum = long.MinValue;
long totalSum = default;
int n = arr.Count;
for (int i = 0; i < n; i++)
{
totalSum += arr[i];
}
for (int i = 0; i < n; i++)
{
long currentSum = totalSum - arr[i];
if (currentSum > maxSum)
{
maxSum = currentSum;
}
if (currentSum < minSum)
{
minSum = currentSum;
}
}
Console.WriteLine(minSum + " " + maxSum);
}
Я на 99% уверен, что оно дает хорошие результаты, поскольку оно прошло тесты на HackerRank и обычно помечается как решенное. Однако в качестве хорошей практики я хотел добавить модульные тесты.
У меня есть два метода тестирования и весь файл Test1.cs:

Код: Выделить всё

namespace LCMinMaxSumTests
{
[TestClass]
public sealed class Test1
{
private TextWriter originalOut = null!;
private StringWriter sw = null!;

[TestInitialize]
public void SetOriginalConsoleOutput()
{
originalOut = Console.Out;
sw = new StringWriter();
Console.SetOut(sw);
}

[TestCleanup]
public void RestoreOriginalConsoleOutput()
{
Console.SetOut(originalOut);
sw.Flush();
sw.Close();
sw.Dispose();
}

[TestMethod]
public void TestMethod1()
{
List list = new List { 1, 3, 5, 7, 9 };
HCRNKMinMaxSum.Program.MinMaxSum(list);
string expected = string.Format($"16 24{Environment.NewLine}");
Assert.AreEqual(expected, sw.ToString());
}

[TestMethod]
public void TestMethod2()
{
List list = new List { 1, 2, 3, 4, 5 };
HCRNKMinMaxSum.Program.MinMaxSum(list);
string expected = string.Format($"10 14{Environment.NewLine}");
Assert.AreEqual(expected, sw.ToString());
}
}
}
Конкретная проблема, с которой я здесь сталкиваюсь, заключается в том, что результатом первого утверждения является , а второго утверждения пусто - как если бы результаты двух были комбинированный. К моему стыду, я начал спрашивать ответ у Gemini 2, но он, похоже, этого не знал, все решения, которые он давал, приводили к одному и тому же результату. Я почти уверен, что проблема заключается в StringWriter и в том, как она обрабатывается, но я не знаю, как это исправить, и Google мне мало помог, и я также не смог найти решение в StackOverflow. Есть ли что-то очевидное, что мне не хватает? Я сижу над этим уже 3 часа, и у меня нет идей. Буду признателен, если кто-нибудь укажет, что я делаю не так.
VS: 17.12.3
.NET: 9
Я ожидаю, что результаты модульного теста будут соответствовать визуальным результатам, которые я получил при самостоятельном тестировании метода с пользовательскими данными в Main(). В первой версии этих двух методов не было разделов [TestInitialize] и [TestCleanup], но тела методов были заключены в оператор using, например:

Код: Выделить всё

using(StringWriter sw = new())
{
//body of a function
}
С функциональной точки зрения ничего не изменилось, что приводит меня к выводу, что проблема заключается в StringWriter и в том, как обрабатывается вывод консоли. Однако с тем же успехом кто-то может доказать, что я неправ.

Подробнее здесь: https://stackoverflow.com/questions/793 ... console-ou
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • OpenTeLemetry-CPP тестовый приложение работает, но тот же код в Times Out Out Out
    Anonymous » » в форуме C++
    0 Ответы
    5 Просмотры
    Последнее сообщение Anonymous
  • В чем разница между Console.WriteLine и Console.Out.WriteLineAsync в асинхронном методе?
    Anonymous » » в форуме C#
    0 Ответы
    39 Просмотры
    Последнее сообщение Anonymous
  • В чем разница между Console.WriteLine и Console.Out.WriteLineAsync в асинхронном методе?
    Anonymous » » в форуме C#
    0 Ответы
    49 Просмотры
    Последнее сообщение Anonymous
  • В чем разница между Console.WriteLine и Console.Out.WriteLineAsync в асинхронном методе?
    Anonymous » » в форуме C#
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • CSS VH и DVH используются в одном утверждении
    Anonymous » » в форуме CSS
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»