2016-04-20 4 views
1

Ich bin ein Verfahren zu NUnit-Test versucht, wo ich zu behaupten, dass ich die richtige Ausgabe bekommen, aber das Problem ist, jedes Mal, wenn der Code in springt:NunitTest ein console

Console.SetCursorPosition (xOffset , yOffset ++);

Und appearently können Sie nicht SetCursorPosition umleiten, Also meine Frage ist: .. "ist es trotzdem kann ich Unit-Test diese Methode angemessen"

public void Execute() 
    { 
     int xOffset = 84; 
     int yOffset = 3; 
     Console.SetCursorPosition(xOffset, yOffset++); 
     Console.WriteLine("Events"); 

     string header = "| LogType   | Message  |   tagCollection |   Time |"; 

     Console.SetCursorPosition(xOffset, yOffset++); 
     Console.WriteLine(header); 

     Console.SetCursorPosition(xOffset, yOffset++); 
     Console.WriteLine(new string('-', header.Length)); 

     if (!string.IsNullOrWhiteSpace(Status)) 
     { 
      Console.SetCursorPosition(xOffset, yOffset++); 
      Console.WriteLine(Status); 
     } 

     foreach (string str in NotificationList) 
     { 
      Console.SetCursorPosition(xOffset, yOffset++); 
      Console.WriteLine(str); 
     } 
    } 

Hier ist mein Test:

[Test] 
    public void NotificationDisplayer_inputTestString_ExpectedResult() 
    { 

     using (StringWriter sw = new StringWriter()) 
     { 
      Console.SetOut(sw); 
      uutNotificationDisplayer.Execute(); 
      Assert.That(sw.ToString()), Is.EqualTo(expectedResult)); 
     } 
    } 
+0

warum nicht einfach eine falsche Methode von diesem machen und den Offset-Wert für y ändern? Genau das versuchen Sie hier in Ihrem Test. Mehr als das, könntest du uns bitte auch deinen Unit Test geben !! –

Antwort

0

Der Code macht zwei Dinge an einem Ort, die das Problem verursachen.

Sie möchten eine Zeichenfolge in Ihrer Methode erstellen und sie drucken. Sie sollten getrennt sein. Der Testfall interessiert, ob der String richtig aufgebaut ist oder nicht, nicht wenn der oder Console.SetCursorPosition richtig funktioniert. Also lassen Sie uns den Code wie unten gezeigt trennen.

static void Main(string[] args) 
{ 
    var messages = GetMessagesToPrint(); 
    Execute(84, 3, messages); 
} 

// Method for which you should write the test method on its output 
private static List<string> GetMessagesToPrint() 
{ 
    string header = "| LogType   | Message  |   tagCollection |   Time |"; 
    ... 
    ...// actual list of string you want to construct. 
    ... 
    var messages = new List<string> {"Events", header, new string('-', header.Length)}; 
    return messages; 
} 

//This doesnt need a test method 
public static void Execute(int xOffset, int yOffset, IEnumerable<string> messageToPrint) 
{ 
    foreach (var message in messageToPrint) 
    { 
     Console.SetCursorPosition(xOffset, yOffset++); 
     Console.WriteLine(message); 
    } 
} 

Dann können Sie Unit-Test für GetMessagesToPrint und brauchen sich keine Sorgen über die System.Console Methoden schreiben.