2016-08-29 3 views
6

Ich baue eine ASP.NET-Core-Webanwendung (.Net Framework) und habe es schwer, herauszufinden, wie man Komponententests damit beginnen kann. Ich ziele auf die .net Framework-Version 4.6.1Wie testen Sie Unit ASP.NET Core Web Application (.NET Framework) Unit?

Wenn ich ein reguläres "Class Library" -Projekt für 4.6.1, wie ich für die vorherige Version von MVC erstellen würde, kann ich Referenzen zu meinem MVC-Projekt hinzufügen (die ist Teil derselben Lösung), aber alle Namespaces, die ich über eine using-Anweisung hinzufüge, melden einen Fehler, bei dem mir eine Referenz fehlt oder eine Anweisung verwendet wird. Wenn ich im Solution Explorer auf den Verweis unter dem Abschnitt "Referenzen" doppelklicke, sagt er mir, dass das Projekt nicht gefunden werden kann oder noch nicht erstellt wurde.

Ich habe versucht, eine "Klassenbibliothek (.NET Core)" zu erstellen, aber das klagt, da ich auf .NET Framework und nicht auf .NET Core ausgerichtet bin. Ich habe die Klassenbibliotheken Project.json bearbeitet, damit sie auf das .net-Framework ausgerichtet sind, und das erlaubt mir, meine Referenzen hinzuzufügen und beschwere mich nicht, wenn ich die Namespaces in einer using-Anweisung finde, aber keiner meiner Tests vom Test-Runner entdeckt wird. Ich habe sowohl XUnit als auch NUnit ausprobiert und beide verhalten sich gleich.

Ist es möglich, eine ASP.Net Core Web Application, die auf .NET Framework 4.6.1 abzielt, zu testen oder muss ich mich an den .NET Core binden?

bearbeiten meine Testklasse Hier ist meine Testklasse abgespeckte auf das absolute Minimum zu addieren. TestBank.Services ist die Klasse, die ich testen möchte.

using System; 
using TestBank.Services; 
using Xunit; 

namespace TestBankUnitTests 
    {  
    public class Class1 
    {   
     [Fact] 
     public void TestA() 
     { 
      Assert.True(false); 
     } 
    } 
} 

und hier ist mein project.json

{ 
    "version": "1.0.0-*", 

    "dependencies": { 
     "xunit": "2.1.0", 
     "dotnet-test-xunit": "1.0.0-rc2-build10025", 
     "TestBank": "1.0.0-*" 
    }, 

    "frameworks": { 
     "net461": { 
     } 
    } 
} 
+0

Unit-Test Entdeckung ist ziemlich heikel. Ich fand, dass ich eine Lösung haben musste, die nur Projekte enthielt, die .net Kernprojekte waren, oder es würde die Tests nicht finden. Zum Beispiel hatte ich eine Kern-Core-MVC-App und eine .core-Bibliothek mit meinen Tests und ein drittes Projekt, das nur eine Klassenbibliothek war (nicht .net-Kern). VS war aus irgendeinem Grund nicht in der Lage, Tests zu erkennen, bis ich diese Nicht-Core-Bibliothek aus der Lösung entfernt hatte. –

+0

Momentan hat meine Lösung nur das MVC-Projekt und die .net-Kernklassenbibliothek (geändert, um .NET Framework 4.6.1 zu targetieren) und entdeckt die Tests nicht. Das lässt mich fragen, ob die Test-Erkennung nur für echte .net-Kern- und nicht .net-Kern-Targeting für das .net-Framework funktioniert. –

+0

Sollte kein Problem sein. Das mache ich auch in meinen Lösungen. Können Sie Ihre Testkurse veröffentlichen? Sie sind öffentliche Klassen mit öffentlichen Methoden, die mit "Fact" oder gleichwertigem Recht gekennzeichnet sind? –

Antwort

8

Ihre project.json braucht eine testRunner Einstellung. Laut project.json documentation gibt die Einstellung testRunner nicht nur an, welches Testframework verwendet werden soll, sondern markiert das Projekt auch als Testprojekt.

Versuchen Sie, das Hinzufügen und sehen, ob es Ihre Tests findet (lokal Nachweis erbracht, dass es Tests nicht ohne diese Einstellung in der Datei finden)

{ 
    "version": "1.0.0-*", 

    "dependencies": { 
     "xunit": "2.1.0", 
     "dotnet-test-xunit": "1.0.0-rc2-build10025", 
     "TestBank": "1.0.0-*" 
    }, 

    "frameworks": { 
     "net461": { 
     } 
    }, 

    "testRunner": "xunit" 
} 
+0

Das hat den Trick gemacht. Jetzt fühle ich mich albern, dass ich das anfangs verpasst habe! Vielen Dank! –

0

ich ein ähnliches Problem und eine Lösung gefunden. Ich poste es hier für den Fall, dass es jemandem hilft. Was ich gelernt habe, ist, dass die Verwendung einer xproj-Bibliothek, die auf net461 abzielt, um ein Asp.Net Core Project (.Net Framework) -Projekt für net461 und ein Windows-Klassenbibliothek-Targeting-Framework 4.61 zu testen, aber das Setup scheint sehr knifflig und fragil zu sein. Die wichtigste Erkenntnis für mich kam aus diesem Thread https://github.com/aspnet/Tooling/issues/245, wo @BradRem angezeigt, dass die Ordnerstruktur der Projekte der Quelle der Probleme schien.

Zunächst versuchte ich erfolglos diese Ordnerstruktur zu verwenden:

src
____Asp.Net Kernprojekt (.Net Framework) Projekt Net461
____Windows Klassenbibliothek Rahmen Targetings 4.61

Test
____Core Bibliothek verwendet lief xUnit Tests

Aber als ich versuchte, die Tests mit dieser Ordnerstruktur, um es auszuführen erzeugte die Ausnahme, die wie folgt beginnt:

Unable to start C:\Program Files\dotnet\dotnet.exe 
dotnet-test Error: 0 : [ReportingChannel]: Waiting for message failed System.IO.IOException: Unable to read data from the transport connection: An established connection was aborted by the software in your host machine. ---> System.Net.Sockets.SocketException: An established connection was aborted by the software in your host machine 
    at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags) 
    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
    --- End of inner exception stack trace --- 
    at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size) 
    at System.IO.Stream.ReadByte() 
    at System.IO.BinaryReader.ReadByte() 
    at System.IO.BinaryReader.Read7BitEncodedInt() 
    at System.IO.BinaryReader.ReadString() 
    at Microsoft.DotNet.Tools.Test.ReportingChannel.ReadMessages() 

Aber Als ich in die folgende Ordnerstruktur wechselte, konnte ich es zur Arbeit bringen:

src
____Asp.Net C Erz-Projekt (.Net Framework) Projekt Targeting Net461
____Windows Klassenbibliothek Targeting Rahmen 4.61
____Core Bibliothek verwendet laufen xUnit Tests

So ist der Schlüssel anzog den Ordner, der die Testklassenbibliothek im src Ordner untergebracht, wo die andere Projekte Ordner waren.

Die andere Sache, die einen großen Unterschied zu machen schien, bestand darin, die Referenzen zu den anderen beiden Projekten gleichzeitig und nicht einzeln dem Core Library-Testprojekt hinzuzufügen.

0

Ich habe etwas gefunden, das für mich funktioniert.
In meinem Testprojekt, sieht meine project.json-Datei wie folgt:

{ 
    "version": "1.0.0-*", 
    "testRunner": "xunit", 

    "dependencies": { 
    "xunit": "2.2.0-beta2-build3300", 
    "dotnet-test-xunit": "2.2.0-preview2-build1029", 
    "Ng2a.WebApi": "1.0.0-*" 
    }, 

    "frameworks": { 
    "net452": { 
    } 

    } 
} 

'Ng2a.WebApi' mein Web-api Kernprojekt ist. Es zielt nur auf net452. Die Ng2a.WebApi project.json Datei sieht wie folgt aus:

"frameworks": { 
"net452": {} 

},

Verwandte Themen