Jestem zwolennikiem TDD, więc dla mnie testowanie aplikacji jest ważnym elementem. Ustawienie projektu testowego w ASP.NET Core to dla nowa lekcja. Zacząłem klasycznie: prawy przycisk myszką na solucję -> Add -> New Project… -> po lewej stronie wybrałem zakładkę Visual C# -> Test -> Unit Test Project, odpowiednia nazwa i OK. Następnie dodałem referencję:
Wybrałem referencje do innego projektu i otrzymuję komunikat:
A reference to ‚nazwaProjektu’ could not be added.
Pogooglowałem jak to można dodać projekt z testami do solucji z ASP.NET Core 1.0. Znalazłem na stronie xUnity odpowiedź jak odpalić projekt z testami. Jeżeli dobrze rozumiem, to aby testować aplikacje ASP.NET Core 1.0 trzeba też mieć dedykowane narzędzie do testowania.
Postępowałem zgodnie z instrukcjami dostępnymi na stronie xUnity. Nowy projekt postanowiłem jednak stworzyć w folderze src.
Skopiowałem bez wahania cały project.json jaki był przedstawiony na stronie:
{ "version": "1.0.0-*", "description": "", "authors": [ "" ], "tags": [ "" ], "projectUrl": "", "licenseUrl": "", "dependencies": { "xunit": "2.1.0", "xunit.runner.dnx": "2.1.0-rc1-build204" }, "commands": { "test": "xunit.runner.dnx" }, "frameworks": { "dnx451": { }, "dnxcore50": { } } }
Przekopiowałem testy ze strony i doszedłem do punktu: Run tests from the console. I ponownie jak w porzednim poście: command prompt, wszedłem do folderu solucji i wpisałem:
dnx test
Wszystko działało jak w przykładzie ze strony. Z resztą kroków też nie było problemu. Test -> Windows -> Test Explorer. Skomplikowałem solucję z testami i w Test Explorze pojawiły mi się wszystkie test.
Teraz musiałem połączyć główny projekt z projektem testowym. W projekcie testowym dodałem referencje do głównego projektu:
Po dodaniu referencji automatycznie uaktualnił się plik project.json.
{ "version": "1.0.0-*", "description": "", "authors": [ "" ], "tags": [ "" ], "projectUrl": "", "licenseUrl": "", "dependencies": { "xunit": "2.1.0", "xunit.runner.dnx": "2.1.0-rc1-build204" }, "commands": { "test": "xunit.runner.dnx" }, "frameworks": { "dnx451": { "dependencies": { "PokerWebsite": "1.0.0-*" } }, "dnxcore50": { } } }
Szybko dodałem jedną linijkę do jednego z testów, aby sprawdzić czy referencja działa:
using PokerWebsite.Core.Domain; using Xunit; namespace PokerWebsiteTests { public class Class1 { [Fact] public void PassingTest() { var player = new Player(); Assert.Equal(4, Add(2, 2)); } [Fact] public void FailingTest() { Assert.Equal(5, Add(2, 2)); } int Add(int x, int y) { return x + y; } } }
Niestety nie działała. Otrzymałem dwa błędy:
The type or namespace name ‚Player’ could not be found (are you missing a using directive or an assembly reference?)
The type or namespace name ‚PokerWebsite’ could not be found (are you missing a using directive or an assembly reference?)
Trochę czasu mi zeszło zanim doszedłem do konsensusu co jak można pozbyć się tych błędów. Co zrobiłem? Poprawiłem nieco mój project.json w projekcie z testami:
{ "version": "1.0.0-*", "description": "", "authors": [ "" ], "tags": [ "" ], "projectUrl": "", "licenseUrl": "", "dependencies": { "xunit": "2.1.0", "xunit.runner.dnx": "2.1.0-rc1-build204" }, "commands": { "test": "xunit.runner.dnx" }, "frameworks": { "dnx451": { "dependencies": { "PokerWebsite": "1.0.0-*" } }, "dnxcore50": { "dependencies": { "PokerWebsite": "1.0.0-*" } } } }
Ale wiele to nie dało mi jeszcze. Wręcz przeciwnie otrzymałem dodatkowy błąd:
The dependency PokerWebsite 1.0.0 in project PokerWebsiteTests does not support framework DNXCore,Version=v5.0.
Żeby szybko to naprawić wystarczyło dodać linijkę w pliku project,json w projekcie do którego robiłem referencję:
{ "version": "1.0.0-*", "compilationOptions": { "emitEntryPoint": true }, "dependencies": { "EntityFramework.Commands": "7.0.0-rc1-final", "EntityFramework.Core": "7.0.0-rc1-final", ... "Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-rc1-final" }, "commands": { "web": "Microsoft.AspNet.Server.Kestrel", "ef": "EntityFramework.Commands" }, "frameworks": { "dnx451": { }, "dnxcore50": { } }, "exclude": [ "wwwroot", "node_modules" ], "publishExclude": [ "**.user", "**.vspscc" ], "scripts": { "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ] } }
Po dodaniu tej linijki nie miałem żadnych innych błędów. Obydwa projekty zaczęły się kompilować. Mogłem kliknąć w Test Explorer na Run All i testy były ‚przeprowadzone’.