2015-07-30 26 views
20

Sto cercando di ottenere alcune classi C# controller, model e repository (accesso ai dati) sotto unit test, in Visual Studio 2015, con ASP.NET Core MVC (ASP.NET 5 durante l'anteprima, ora chiamato ASP.Net Core) app.Come si esegue il test dell'unità su un controller ASP.NET Core o su un oggetto modello?

ho la seguente struttura:

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

Il MainApp sta utilizzando DNX 4.5.1, ma sembra che se creo un test NUnit Unità di applicazione di serie, è disponibile solo come classe classico .NET Framework libreria, destinata a .NET Framework 4.5.2, non come una libreria di classi Web che può funzionare con la mia app principale.

Quindi, nel caso in cui potrebbe funzionare come un classico framework framework Microsoft Framework Microsoft framework (.net assembly), ho cercato di trovare manualmente e aggiungere riferimenti (aggiungendo riferimento e browse) per ottenere .NET. dipendenze da risolvere. Sono consapevole del fatto che i riferimenti all'assembly .NET sono purtroppo non transitivi. Quindi se UnitTest.dll ha un riferimento a MainApp.dll e MainApp.dll dipende da ASP.NET MVC e tutto il resto da cui dipende, devo farlo da solo. Questo è quello che sto cercando di fare. Ho aggiunto un riferimento a C:\dev\Demo\ITConsole\artifacts\bin\ITConsole\Debug\dnx451\ITConsole.dll nel mio progetto di test dell'unità in modo da poter iniziare a ottenere il codice da compilare. Le classi di test unitario vengono compilate ma non vengono eseguite, probabilmente a causa del caos di tentare di aggiungere un riferimento a ASP.NET.

In questo momento, anche se ho aggiunto un riferimento a Common.Logging.Core, e Common.Logging, quando faccio clic su "Esegui tutti" sulla explorer test ottengo questo errore:

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) 

(Al momento questa domanda è stata posta ...) Nessuno dei modelli di anteprima di asp.net 5 mvc può generare test unitari per te. Puoi persino testare un'unità una nuova e brillante applicazione ASP.NET Core? Vedi lo screenshot qui sotto, per esempio di come il normale modo di iniziare il test unitario non è disponibile in VS 2015 usando MSTEST.

no unit test for you

+0

Alla domanda: "Quando vi risolvere il tuo prodotto" domanda qui: https://social.msdn.microsoft.com/Forums/vstudio/en-US/6bf553bc-2bbb-4f2e-a7aa -72c8d9b74852/quando-sarà-in-grado-a-unità-test-in-visual-studio-2015-con-aspnet-mvc6? Forum = vsunittest –

+0

Credo che funzionerà a metà settembre, quando Beta8 rotola su. –

+1

Nel frattempo forse prova questo: http://xunit.github.io/docs/getting-started-dnx.html –

risposta

14

UPDATE: xUnit è ancora una grande idea, ma questa risposta è obsoleto ora, perché si può also use the "standard" MSTEST if you want with ASP.NET core. (1 giugno 2016) Trovo che preferisco ancora XUnit, ma è la tua chiamata.

PIÙ RECENTE ISTRUZIONI xUnit LINK: Excellent instructions that may be updated more often than this answer are found at the xUnit wiki.

IDE SOLUZIONE: trovare ed eliminare manualmente %TEMP%\VisualStudioTestExplorerExtensions quando Visual Studio va stupido e non "rilevare" e vi mostrerà i test.

A partire da maggio 2016, con RC1 di ASP.NET Core 1.0 recentemente superato da RC2, non è ancora possibile utilizzare il framework standard di Microsoft Unit Test con ASP.NET Core (Precedentemente ASP.NET 5) e XUnit sembra essere una buona scelta per RC1 e RC2.

È possibile ottenere il test dell'unità XUnit.net per funzionare con ASP.NET Core 1.0.0-RC1, utilizzando le istruzioni ufficiali] 2 nel progetto github XUnit che presenta un caso specifico ".net core per iniziare".

È inoltre possibile installare il nuovo modello di progetto XUnit che fornisce un progetto di test di unità di modello per un normale core completo .net e .net. Fare clic su Strumenti, quindi su Estensioni e aggiornamenti digitare XUnit e trovare xUnit Test Project TEMPLATE e installare il MODELLO. NON INSTALLARE UN RUNNER DI PROVA xUNIT, NON NEI BISOGNI.

ho creato un campione di lavoro e caricato su bitbucket:

https://bitbucket.org/wpostma/aspnet5mvc6xunitdemo

Se non si dispone di Mercurial, è possibile scaricare una zip da bitbucket.

La demo include un test che viene superato e un test che non riesce.

Il Riepilogo rapida:

  1. si dispone di Visual Studio 2015 compresi Update2 e gli strumenti "Anteprima 1.0.0" (gli ultimi a partire da maggio 2016).

  2. Creazione di una libreria di classi Web NON di un progetto di test di unità.

  3. Aggiungere riferimenti XUnit e correggere project.json (esempio di seguito).

  4. Scrivi la tua classe (esempio sotto).

  5. Eseguire test con Test Explorer all'interno di ide o ide esterno, digitare dnx . tests ed esaminare l'output (esempio di seguito).

project.json per 1.0.0-RC2 con riferimento ad un gruppo demo e 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" 
     ] 
    } 
    } 
} 

Unità classe di test (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"); 
     } 

    } 
} 

uscita Esempio da riga di comando in RC1 quando abbiamo utilizzato 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 

Esempio di output in RC2 in cui stiamo usando 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

Ho seguito i tuoi passi e ha funzionato bene! Alcune cose da notare: per aggiornare il mio project.json, ho copiato i "framework" dal mio progetto originale e i "comandi" del tuo esempio. Dopo aver salvato e ripristinato i pacchetti, è stato possibile aggiungere un riferimento al progetto in prova. Poi ho aggiunto xunit e xunit.runner.dnx via nuget (dovevo includere le versioni di anteprima). –

+0

Sì, buon punto. Il mio esempio è solo per le persone che usano esattamente i framework che sto usando. Ho solo dnx451 elencato qui perché nel mio caso, ho avuto alcune dipendenze che non avrebbero funzionato con il coreclr. –

+0

Il tuo 'TestableModelClass' include le classi di controller? – dumbledad

-1

Con il rilascio della RC2, l'integrazione xUnit non funziona più con i miei progetti (questo è stato risolto ora vedi commenti). Per poter testare i miei progetti sono passato a NUnit. Sembra supportare RC2 e ha un testurunner leggero NUnitLite.

In linea di principio è necessario ospitare NUnitLite in un'app console e avviarla con "dotnet run".

Aggiungere le seguenti dipendenze:

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

Per avviare il test runner è necessario aggiungere questo codice nel programma.File cs:

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

Funziona con RC2. Vedi la mia risposta aggiornata. Non è necessario passare a NUNIT. –

+0

Warren, il mio progetto utilizza net 4.6.1 e la versione del runner di test xunit "dotnet-test-xunit": "1.0.0-rc2-build10015" si blocca il testrunner con net461. Mi riferisco a questo bug: https://github.com/dotnet/cli/issues/3103 Tuttavia la build 10025 risolve questo particolare bug e funziona bene dalla console e da VS2015. Quindi ora sono tornato su XUnit. – Geo

+0

Apparentemente NUNIT è una cattiva scelta per il core ASP.NET in questo momento. Ma si spera che sarà migliore di 3.4+. https://github.com/nunit/nunit/issues/1555 –

Problemi correlati