2017-10-02 2 views
0

Hier ist mein Code:Wie erstellt man Einheitentest (inkl. Datenbank) in Visual Studio 2017?

public partial class ActivityService 
    { 
     public SearchActivityOutput GetActivityFromDbByName(SearchActivityInput input) 
     { 
      using (var conn = DbService.GetInstance().GetOpenConnection()) 
      { 
       var savedActivities = GetSearchResultByNameQuery.GetInstance() 
        .Execute(conn, new { Name = input.Name }); 

       var activityList = savedActivities.Select(a => new ActivityDetail() 
       { 
        Name = a.Name, 
        City = a.City, 
        Country = a.Country, 
        Description = a.Description, 
        OperationTime = a.OperationTime, 
        Price = a.Price 
       }).ToList(); 

       var output = new SearchActivityOutput 
       { 
        ActivityList = activityList 
       }; 

       return output; 
      } 
     } 
    } 

Wie kann ich Unit-Test von dieser Klasse zu erstellen?

meine Probe Unit-Test für diese Klasse:

[TestMethod()] 
     public void GetActivityFromDbByNameTest() 
     { 
      Initializer.Init(); 

      var input = new SearchActivityInput { Name = "Marjan" }; 

      var ActList1 = new ActivityDetail() 
       { Name = "Marjan", City = "Bandung", Country = "Indonesia", Description = "coba", OperationTime = "24 Jam", Price = 2000}; 
      var ActList2 = new ActivityDetail() 
       { Name = "Marjan", City = "Bandung", Country = "Indonesia", Description = "coba", OperationTime = "24 Jam", Price = 3500 }; 
      var ActList3 = new ActivityDetail() 
       { Name = "Marjan aja", City = "Jakarta", Country = "Indonesia", Description = "apapun", OperationTime = "2 Hari", Price = 4500 }; 
      var ActList4 = new ActivityDetail() 
       { Name = "Marjan", City = "Stockholm", Country = "Swedia", Description = "123coba", OperationTime = "3 Jam", Price = 3500 }; 
      var ActList5 = new ActivityDetail() 
       { Name = "Marjan", City = "Stockholm", Country = "Swedia", Description = "123coba", OperationTime = "3 Jam", Price = 4500 }; 
      var ActList6 = new ActivityDetail() 
       { Name = "Marjan aja", City = "Jakarta", Country = "Indonesia", Description = "apapun", OperationTime = "2 Hari", Price = 2000 }; 
      var ActList7 = new ActivityDetail() 
       { Name = "Marjan", City = "Stockholm", Country = "Swedia", Description = "123coba", OperationTime = "3 Jam", Price = 3500 }; 
      var ActList8 = new ActivityDetail() 
       { Name = "Marjan", City = "Stockholm", Country = "Swedia", Description = "123coba", OperationTime = "3 Jam", Price = 2000 }; 
      var ActList9 = new ActivityDetail() 
       { Name = "Marjan", City = "Stockholm", Country = "Swedia", Description = "123coba", OperationTime = "3 Jam", Price = 2000 }; 
      var ActList = new List<ActivityDetail>(); 
      ActList.Add(ActList1); 
      ActList.Add(ActList2); 
      ActList.Add(ActList3); 
      ActList.Add(ActList4); 
      ActList.Add(ActList5); 
      ActList.Add(ActList6); 
      ActList.Add(ActList7); 
      ActList.Add(ActList8); 
      ActList.Add(ActList9); 
      var expectedResult = new SearchActivityOutput 
      { 
       ActivityList = ActList 
      }; 
      using (var conn = DbService.GetInstance().GetOpenConnection()) 
      { 
       var actualResult = ActivityService.GetInstance().GetActivityFromDbByName(input); 
       Assert.AreEqual(expectedResult, actualResult); 
      } 

     } 

aber, wenn ich das Gerät Test ausführen, gibt es einige Fehlermeldung geben:

Testname: GetActivityFromDbByNameTest-Test

Ergebnis StackTrace: um xxxx.ActivityServiceTests.GetActivityFromDbByNameTest() in

70 Ergebnismeldung: Assert.AreEqual ist fehlgeschlagen. Erwartet: (xxx.yyy.zzz.Model.SearchActivityOutput). Tatsächlich: (xxx.yyy.zzz.Model.SearchActivityOutput).

+0

Haben Sie den Test getestet, um zu sehen, warum er fehlgeschlagen ist? Sie tun 'Assert.AreEqual (expectedResult, actualResult)', aber diese sind nicht gleich. Halten Sie einen Haltepunkt in dieser Zeile und debuggen Sie durch, um zu sehen, wo sich der tatsächliche Wert von dem unterscheidet, was Sie erwarten. – Stuart

+0

@Stuart Wie halte ich einen Haltepunkt? Ich habe den Haltepunkt gesetzt, aber wenn ich den Komponententest starte, bricht das Programm nicht beim Haltepunkt ab. –

+0

Sie müssen den Test debuggen, den Test nicht ausführen. Setzen Sie also einen Breakpoint auf den Test in der Assert-Zeile, klicken Sie dann mit der rechten Maustaste auf test und wählen Sie debug. – Stuart

Antwort

0

Sie können nicht Unit-Test eine Klasse Das führt alle E/A-bezogenen Aufgaben aus. Selbst wenn Ihre Tests auf Ihrem Entwicklungscomputer gut laufen, werden sie wahrscheinlich auf dem Computer oder CI-Server Ihres Kollegen fehlschlagen.

Damit Ihr Stück Code testbar sein, sollte es sich um eine entweder eine reine Funktion sein, oder es sollte auf eine reine Funktion mit einigen Abstraktionstechniken wie IoC/Funktionen höherer Ordnung/usw.

reduzierbar sein Lernen Sie, testbaren Code zuerst zu schreiben. Dieser Artikel gibt Ihnen einige Hinweise - https://www.toptal.com/resume/sergey-kolodiy (ich bin der Autor).

+0

Vielen Dank, Herr, Sir. Netter Artikel. Ich hoffe, dass Sie mehr über ASP.NET (C#) aus Ihren Artikeln erfahren. –

2

Sie sollten die Datenbank nicht während des Komponententests verwenden.

Wikipedia sagt: Ein gängiges Beispiel dafür sind Klassen, die von einer Datenbank abhängen: Um die Klasse zu testen, schreibt der Tester oft Code, der mit der Datenbank interagiert. Dies ist ein Fehler, da ein Komponententest normalerweise nicht außerhalb seiner eigenen Klassengrenze liegen sollte und insbesondere solche Prozess-/Netzwerkgrenzen nicht überschreiten sollte, da dies zu inakzeptablen Leistungsproblemen bei der Einheitentestsuite führen kann.

Verwenden Sie Testdaten oder eine Dummy-Klasse, die Ihre Datenbank darstellen. https://softwareengineering.stackexchange.com/questions/119367/should-service-test-classes-connect-to-the-database

https://softwareengineering.stackexchange.com/questions/138238/unit-testing-database-coupled-app/138257#138257

+0

Ich stimme zu, aber vielleicht versucht er Integrationstests zu schreiben, um seine Service-Schicht zu testen ... – Stuart

+0

Kannst du ein paar Beispiele zum Unit-Test in Bezug auf die Datenbank geben? –

+0

Es gibt keine Beispiele über Unittest interagieren mit Datenbanken, weil kein Körper das tun. https://softwareengineering.stackexchange.com/questions/119367/should-service-test-classes-connect-to-the-database Antwort auf eine ähnliche Frage https://softwareengineering.stackexchange.com/a/138257 –

0

ich vollständig mit den anderen Aussagen zustimme über die Datenbank nicht in Ihren Unit-Tests verwenden, aber die Antwort auf das Scheitern, die Sie derzeit sind empfangen, dass Sie die CollectionAssert mit Methoden werden sollen Klasse, um den Inhalt von zwei Sammlungen anstelle der Assert-Klasse, die Sie verwenden, zu vergleichen. Wenn Sie wollen nur sicherstellen, dass die zurückgegebene Liste die gleichen Elemente unabhängig von Reihenfolge enthält, können Sie

CollectionAssert.AreEquivalent(expectedResult, actualResult); 

verwenden Wenn Sequenzierauftrag wichtig ist, sollten Sie

verwenden
+0

Was ist der Unterschied zwischen 'CollectionAssert.AreEqivalent' und' CollectionAssert.AreEqivalent'? –

+0

Ich denke, was Sie meinten, ist der Unterschied zwischen CollectionAssert.AreEqual und CollectionAssert.AreEquivalent. AreEquivalent stellt sicher, dass dieselben Elemente vorhanden sind (nicht mehr und nicht weniger), erfordert jedoch nicht, dass sie innerhalb der Sammlungen in der gleichen Reihenfolge angeordnet sind. AreEqual erfordert, dass die gleichen Elemente vorhanden sind * und * in der gleichen Reihenfolge –

+0

Ok, danke, Sir. Ich muss mehr und mehr lernen. –

Verwandte Themen