Ergebnisse von zwei Testmethoden sind nach der Console.Out-Manipulation in einem einzigen Assert vorhanden
Posted: 31 Dec 2024, 12:53
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:
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:
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:
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.
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);
}
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());
}
}
}
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
}