2015-07-30 12 views
20

Próbuję uzyskać kontroler, model i repozytorium (dostęp do danych) klasy C# w ramach testu jednostkowego, w Visual Studio 2015, z ASP.NET Core MVC (ASP.NET 5 podczas podglądu, teraz nazywane ASP.Net Core) aplikacje.W jaki sposób jednostka testuje kontroler lub obiekt modelu ASP.NET Core?

Mam następującą strukturę:

Solution 
     | 
     src 
     | 
     |-- ITConsole  <- main app (ASP.NET MVC, DNX 4.5.1) 
     | 
     `-- ITConsoleTests <- What kind of project should this be? 

MainApp korzysta DNX 4.5.1, ale wydaje się, że jeśli utworzyć standardową aplikację testową NUnit jednostka, jest ona dostępna jedynie jako klasa ramowego klasyczny .NET biblioteka, programowanie .NET Framework 4.5.2, a nie biblioteka klasy WWW, która może współpracować z moją główną aplikacją.

Tak więc na wypadek, gdyby mógł działać jako klasyczny projekt ramowy .NET Framework Microsoft (zestaw .net), próbowałem ręcznie znaleźć i dodać referencje (przez dodanie odwołania i przeglądanie), aby uzyskać .NET zależności do rozwiązania. Jestem świadomy, że odwołania do zestawu .NET są niestety przechodnie. Więc jeśli UnitTest.dll ma odniesienie do MainApp.dll, a MainApp.dll zależy od ASP.NET MVC, i wszystko inne, od czego to zależy, muszę to zrobić sam. Właśnie to próbuję zrobić. Dodałem odwołanie do C:\dev\Demo\ITConsole\artifacts\bin\ITConsole\Debug\dnx451\ITConsole.dll do mojego projektu testu jednostki, więc mogłem zacząć tworzyć kod do kompilacji. Klasy testów jednostkowych są kompilowane, ale nie działają, prawdopodobnie z powodu problemu z dodaniem odwołania do ASP.NET.

Teraz, mimo że zostały dodane odniesienie do Common.Logging.Core i Common.Logging, gdy klikam "Run All" w eksploratorze testów otrzymuję ten błąd:

Test Name: TestStudyLogReadDocument 
Test FullName: ITConsoleTests.ITConsoleTestStudyLog.TestStudyLogReadDocument 
Test Source: C:\dev\Demo\ITConsole\ITConsoleTests\ITConsoleTestStudyLog.cs : line 52 
Test Outcome: Failed 
Test Duration: 0:00:00.0712058 

Result StackTrace: 
at Couchbase.Configuration.Client.ClientConfiguration..ctor() 
    at ITConsole.Repository.StudyLogRepository..ctor() in C:\dev\Demo\ITConsole\src\ITConsole\Repository\StudyLogRepository.cs:line 39 
    at ITConsoleTests.ITConsoleTestStudyLog.SetupDb() in C:\dev\Demo\ITConsole\ITConsoleTests\ITConsoleTestStudyLog.cs:line 30 
    at ITConsoleTests.ITConsoleTestStudyLog.TestStudyLogReadDocument() in C:\dev\Demo\ITConsole\ITConsoleTests\ITConsoleTestStudyLog.cs:line 53 
Result Message: 
Test method ITConsoleTests.ITConsoleTestStudyLog.TestStudyLogReadDocument threw exception: 
System.IO.FileLoadException: Could not load file or assembly 'Common.Logging.Core, Version=3.1.0.0, Culture=neutral, PublicKeyToken=af08829b84f0328e' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040) 

(W tym czasie zadano pytanie ...) Żaden z szablonów podglądu asp.net 5 mvc nie może wygenerować testów jednostkowych dla ciebie. Czy możesz nawet przetestować nową, błyszczącą aplikację ASP.NET Core? Zobacz zrzut ekranu poniżej, na przykład jak normalny sposób rozpoczęcia testów jednostkowych nie jest dostępny w VS 2015 przy użyciu MSTEST.

no unit test for you

+0

pytanie "kiedy będzie naprawić swój produkt" pytanie tutaj: https://social.msdn.microsoft.com/Forums/vstudio/en-US/6bf553bc-2bbb-4f2e-a7aa -72c8d9b74852/kiedy-będzie-można-móc-testować-urządzenia-w-wizualnym-studio-2015-z-aspnet-mvc6? Forum = vsunittest –

+0

Wierzę, że to będzie działać do połowy września, kiedy Beta8 będzie na zewnątrz. –

+1

W międzyczasie spróbuj tego: http://xunit.github.io/docs/getting-started-dnx.html –

Odpowiedz

14

UPDATE: xUnit jest nadal świetny pomysł, ale ta odpowiedź jest już nieaktualne, ponieważ można also use the "standard" MSTEST if you want with ASP.NET core. (1 czerwca 2016 r.) Stwierdzam, że nadal wolę XUnit, ale to twoja rozmowa.

OSTATNIE INSTRUKCJE xUnit LINK: Excellent instructions that may be updated more often than this answer are found at the xUnit wiki.

IDE Obejście: ręcznie znaleźć i usunąć %TEMP%\VisualStudioTestExplorerExtensions gdy Visual Studio idzie głupi i nie będzie „wykryć” i pokazać swoje testy.

Począwszy od maja 2016 r., Gdy program ASP.NET Core 1.0 RC1 został ostatnio zastąpiony przez RC2, nadal nie jest możliwe korzystanie ze standardowego rozwiązania Microsoft Unit Test z ASP.NET Core (dawniej ASP.NET 5) i XUnit wydaje się być dobrym wyborem dla RC1 i RC2.

Możesz pobrać test jednostki XUnit.net do pracy z ASP.NET Core 1.0.0-RC1, korzystając z oficjalnych instrukcji] 2 w projekcie Xitn github, który ma specyficzny przypadek ".net core getting start".

Można również zainstalować szablon XUnit New Project, który zapewnia szablonowy test testowy dla standardowych pełnych rdzeni .net i .net. Kliknij Narzędzia, a następnie Rozszerzenia i aktualizacje wpisz w XUnit, a następnie znajdź Projekt testowy xUnit SZABLON i zainstaluj SZABLON. NIE WOLNO INSTALOWAĆ JAKIEGOKOLWIEK PRZETWORNIKA TESTOWEGO XUNIT, NIE POTRZEBUJESZ.

Stworzyłem próbkę roboczą i wysłał go do bitbucket:

https://bitbucket.org/wpostma/aspnet5mvc6xunitdemo

Jeśli nie masz mercurial można pobrać zip z bitbucket.

Demo zawiera jeden test, który przechodzi, i jeden test, który nie powiedzie się.

Quick Podsumowanie:

  1. masz Visual Studio 2015 w tym Update2 i narzędzi "1.0.0 Preview" (ostatnia w maju 2016).

  2. Utwórz bibliotekę klas WWW NIE jako projekt testu jednostkowego.

  3. Dodaj odwołania do XUnit i napraw swój project.json (przykład poniżej).

  4. Napisz swoją klasę (przykład poniżej).

  5. Wykonaj testy za pomocą Eksploratora testów wewnątrz ide, lub poza ide, wpisz dnx . tests i sprawdź wyjście (przykład poniżej).

project.json na 1.0.0-rc2, w odniesieniu do zespołu demo i xUnit:

{ 
    "version": "1.0.0-*", 

    "testRunner": "xunit", 

    "dependencies": { 
    "Microsoft.NETCore.App": { 
     "version": "1.0.0-rc2-3002702", 
     "type": "platform" 
    }, 

    "dotnet-test-xunit": "1.0.0-rc2-*", 

    "xunit": "2.1.0", 


    "YetAnotherWebbyDemo": "1.0.0-*" 
    }, 

    "frameworks": { 
    "netcoreapp1.0": { 
     "imports": [ 
     "dotnet5.6", 
     "dnxcore50", 
     "portable-net45+win8" 
     ] 
    } 
    } 
} 

jednostki grupy testowej (whatever.cs)

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 

using Xunit; 

using YetAnotherWebbyDemo.Models; 

namespace YetAnotherWebbyDemoTests 
{ 
    // This project can output the Class library as a NuGet Package. 
    // To enable this option, right-click on the project and select the Properties menu item. In the Build tab select "Produce outputs on build". 
    public class TestBasics 
    { 
     [Fact] 
     public void TestAdd() 
     { 

      TestableModelClass TestMe = new TestableModelClass(); 


      Assert.True(TestMe.Add(3, 2) == 5, "Basic Math Failure"); 

      Assert.True(TestMe.Add(-3, -2) == -5, "Basic Math Failure"); 
     } 

    } 
} 

Przykâadowa z linii poleceń w RC1, gdy używaliśmy dnx:

C:\dev\Demo\YetAnotherWebbyDemo\src\YetAnotherWebbyDemoTests>dnx . test 

xUnit.net DNX Runner (32-bit DNX 4.5.1) 
    Discovering: YetAnotherWebbyDemoTests 
    Discovered: YetAnotherWebbyDemoTests 
    Starting: YetAnotherWebbyDemoTests 
    YetAnotherWebbyDemoTests.TestBasics.TestAdd [FAIL] 
     Basic Math Failure 
     Expected: True 
     Actual: False 
     Stack Trace: 
     YetAnotherWebbyDemoTestBasics.cs(25,0): at YetAnotherWebbyDemoTests.Test 
Basics.TestAdd() 
    Finished: YetAnotherWebbyDemoTests 
=== TEST EXECUTION SUMMARY === 
    YetAnotherWebbyDemoTests Total: 1, Errors: 0, Failed: 1, Skipped: 0, Time: 0.263s 

Przykâadowa w RC2 gdzie używamy dotnet:

D:\dev\aspnet5mvc6xunitdemo\src\YetAnotherWebbyDemoTests>dotnet test 
Project YetAnotherWebbyDemo (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation. 
Project YetAnotherWebbyDemoTests (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation. 
xUnit.net .NET CLI test runner (64-bit win10-x64) 
    Discovering: YetAnotherWebbyDemoTests 
    Discovered: YetAnotherWebbyDemoTests 
    Starting: YetAnotherWebbyDemoTests 
    YetAnotherWebbyDemoTests.TestBasics.TestAdd [FAIL] 
     Basic Math Failure 
     Expected: True 
     Actual: False 
     Stack Trace: 
     D:\dev\aspnet5mvc6xunitdemo\src\YetAnotherWebbyDemoTests\YetAnotherWebbyDemoTestBasics.cs(26,0): at YetAnotherWebbyDemoTests.TestBasics.TestAdd() 
    Finished: YetAnotherWebbyDemoTests 
=== TEST EXECUTION SUMMARY === 
    YetAnotherWebbyDemoTests Total: 1, Errors: 0, Failed: 1, Skipped: 0, Time: 0.205s 
SUMMARY: Total: 1 targets, Passed: 0, Failed: 1. 
+0

Podążyłem za twoimi krokami i wszystko działało dobrze! Kilka rzeczy do zapamiętania: Aby zaktualizować mój project.json, skopiowałem "ramy" z mojego oryginalnego projektu i "polecenia" z twojego przykładu. Po zapisaniu i przywróceniu pakietów mogłem dodać odniesienie do testowanego projektu. Następnie dodałem xunit i xunit.runner.dnx przez nuget (musiałem dołączyć wersje podglądu). –

+0

Tak, dobra uwaga. Mój przykład jest tylko dla osób używających dokładnie tych frameworków, których używam. Mam tutaj tylko dnx451, ponieważ w moim przypadku miałem pewne zależności, które nie działałyby z coreclr. –

+0

Czy klasa 'TestableModelClass' zawiera klasy kontrolerów? – dumbledad

-1

Wraz z wydaniem RC2, integracja xUnit nie działa już z moich projektów (zostało to naprawione Zobacz komentarze). Aby móc przetestować moje projekty, przełączyłem się na NUnit. Wygląda na to, że obsługuje RC2 i ma lekki testrunner NUnitLite.

Po prostu musisz uruchomić NUnitLite w aplikacji konsolowej i zacząć od "dotnet run".

Dodaj następujący zależności:

"dependencies": { 
"NUnit": "3.2.1", 
"NUnitLite": "3.2.1", 

Aby rozpocząć zawodnik testowy trzeba dodać ten kod do programu.plik CS:

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     new AutoRun().Execute(args); 
    } 
} 
+0

Działa z RC2. Zobacz moją zaktualizowaną odpowiedź. Nie musisz przełączać się na NUNIT. –

+0

Warren, mój projekt korzysta z sieci 4.6.1, a wersja testera Xunit "dotnet-test-xunit": "1.0.0-rc2-build10015" powoduje awarię testrunnera za pomocą net461. Odnoszę się do tego błędu: https://github.com/dotnet/cli/issues/3103 Mimo to kompilacja 10025 rozwiązuje ten konkretny błąd i działa dobrze z konsoli i VS2015. Teraz wróciłem do XUnit. – Geo

+0

Wygląda na to, że NUNIT jest złym wyborem dla rdzenia ASP.NET w tym momencie. Miejmy nadzieję, że poprawi się o 3,4+. https://github.com/nunit/nunit/issues/1555 –

Powiązane problemy