Ergebnisse von zwei Testmethoden sind nach der Console.Out-Manipulation in einem einzigen Assert vorhandenC#

Ein Treffpunkt für C#-Programmierer
Guest
 Ergebnisse von zwei Testmethoden sind nach der Console.Out-Manipulation in einem einzigen Assert vorhanden

Post by Guest »

Ich fange an, Programmieren zu lernen und programmiere einfache algorithmische Übungen. Ich habe gehört, dass das Codieren von Unit-Tests eine gute Praxis ist. Ich bin jedoch auf ein Problem mit einer Funktion gestoßen, die ich noch nicht kenne. Ich wollte die Konsolenausgabe abfangen und in einem Assert verwenden.
Dies ist die Funktion, die ich teste:

Code: Select all

        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);
}
Ich bin zu 99 % sicher, dass es gute Ergebnisse liefert, da es die Tests auf HackerRank bestanden hat und allgemein als gelöst markiert ist. Als gute Praxis wollte ich jedoch Unit-Tests hinzufügen.
Das sind zwei Testmethoden und die gesamte Test1.cs-Datei, die ich habe:

Code: Select all

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());
}
}
}
Das spezifische Problem, auf das ich hier stoße, besteht darin, dass das Ergebnis des ersten Asserts ist, während das zweite Assert leer ist – als ob die Ergebnisse der beiden vorhanden wären kombiniert. Beschämenderweise begann ich, Gemini 2 nach der Antwort zu fragen, aber es schien es nicht zu wissen, alle Lösungen, die es gab, führten zum gleichen Ergebnis. Ich bin mir fast sicher, dass das Problem beim StringWriter und seiner Handhabung liegt, aber ich weiß nicht, wie ich es beheben kann, und Google hat mir wenig geholfen, und ich konnte die Lösung auch nicht auf StackOverflow finden. Gibt es etwas Offensichtliches, das mir fehlt? Ich sitze nun seit 3 ​​Stunden darauf und habe keine Ideen mehr. Ich wäre dankbar, wenn jemand darauf hinweisen könnte, was ich falsch mache.
VS: 17.12.3
.NET: 9
Ich gehe davon aus, dass die Ergebnisse des Unit-Tests mit den visuellen Ergebnissen übereinstimmen, die ich erhalten habe, als ich die Methode selbst mit benutzerdefinierten Daten in Main() getestet habe. Die erste Version dieser beiden Methoden bestand darin, dass es keine Abschnitte [TestInitialize] und [TestCleanup] gab, sondern die Methodenkörper in eine using-Anweisung eingeschlossen waren, etwa so:

Code: Select all

using(StringWriter sw = new())
{
//body of a function
}
Aus funktionaler Sicht hat sich nichts geändert, was mich zu dem Schluss führt, dass das Problem beim StringWriter und der Art und Weise liegt, wie die Konsolenausgabe gehandhabt wird. Allerdings könnte mir genauso gut jemand das Gegenteil beweisen.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post