Jeg har forsøgt at skabe en opgave som dækker nogle af de emner vi har været igennem i forløbet. Den tager udgangspunkt i vores tidligere ProsaApp-eksempel, som vi har arbejdet med i forløbet. Du skal ikke skrive meget kode, men du skal implementere nogle grundlæggende funktioner for at få applikationen til at fungere på en helt konkret måde.
Det første du skal gøre er at downloade hele repositoriet. Du kan gøre dette ved at klone det med git eller downloade det som zip-fil (den store grønne knap). Hele løsningen pakkes ud i en temporær mappe - eksempelvis c:\temp\prosa.
Herefter kan du åbne mappen i Visual Studio Code (eller ProsaOpg.sln i Visual Studio eller Rider - her antages VSC).
- Først skal du installere .NET 9.0 SDK, hvis du ikke allerede har det installeret. Du kan finde installationsvejledningen her.
- Dernæst skal du åbne terminalen i Visual Studio Code og navigere til den mappe, hvor du har pakket løsningen ud. Du kan gøre dette ved at skrive
cd c:\temp\prosai terminalen. - Når du er i den rigtige mappe, skal du køre kommandoen
dotnet restorefor at installere de nødvendige pakker. - Herefter kan du bygge alle projekter ved at skrive
dotnet buildi terminalen. Den skulle gerne bygge uden fejl. - Naviger nu til
ProsaOpg/ConsoleUIog skrivdotnet runi terminalen. Du skulle gerne seHello, World - debug. Prøv også at skrivedotnet run -c Releasehvilke vil kompilere og afvikle koden i Release mode. Du skulle gerne seHello, World - Release. - Naviger nu til
ProsaOpg/ProsaOpg.Testog skrivdotnet testi terminalen. Du skulle gerne se at alle tests (der er kun en lige nu) kører uden fejl. Prøv ogsådotnet test -l "console;verbosity=detailed"for at se mere detaljeret output fra testene.
- Når alt spiller kan du begynde at kigge på koden.
- Bemærk at der er 4 projekter - ConsoleUI (brugerflade), Data (data og repository), Types (domæne typer) og Test (test). Sørg for at kigge grundigt på koden og forstå hvordan de forskellige projekter hænger sammen. Der er også en SQLite database
Customers.dbiConsoleUImappen, som indeholder nogle testdata.- I
Typeser en helt simpel klasseCustomerdefineret. - I
Dataer der en interfaceIDataAccessdefineret, som indeholder en metode til at hente kunder. Der er enEfDataAccessService(bruger EF til at hente data) ogMockDataAccessService(statiske data) der implementerer interfacet. Der er også enDataAccessFactoryder returnerer den rigtige data access service baseret på en konfiguration - her debug og release. - I
ConsoleUIer der enProgram.csmed en simpel "Hello World" - I
Tester der en testklasseAllTestsder her en helt simpelIsCreatedDateCorrectWhenCreatingANewCustomerder tester omCreatedDateer sat korrekt når en ny kunde oprettes - blot som et eksempel.
- I
Projektstruktur:
- ProsaOpg/
- ProsaOpg.sln (solution fil)
- ConsoleUI/
- Program.cs
- Customers.db (SqLite database)
- Data/
- IDataAccess.cs
- EfDataAccessService.cs
- MockDataAccessService.cs
- DataAccessFactory.cs
- Types/
- Customer.cs
- Test/
- AllTests.cs
Ideen med datalaget er, at det skal være nemt at skabe en instans af IDataAccess og derefter kalde metoderne på den. Det er derfor vigtigt at du forstår hvordan DataAccessFactory fungerer, da det er den der skaber instanser af objekter som implementerer IDataAccess - og dermed kan tale med forskellige datakilder - herunder i dette tilfælde en database og en mock service.
Så dit job er at skrive lidt kode i ConsoleUI og Test projekterne, så du kan hente kunder fra databasen og vise dem i konsollen. Du skal også skrive en test der tester at kunderne bliver hentet korrekt fra databasen.
I ConsoleUI skal du ændre Program.cs så den henter kunderne fra datakilden og viser dem i konsollen. Du skal bruge DataAccessFactory til at få fat i den rigtige instans af IDataAccess (hvis den kører i debug mode skal den hente fra MockDataAccessService, hvis den kører i release mode skal den hente fra EfDataAccessService).
Så når du kører dotnet run i ConsoleUI skal den hente mock kunder vise dem i konsollen, og når du kører dotnet run -c Release skal den hente kunder fra databasen og vise dem i konsollen. Det kan skal se således ud:
dotnet run
Hello, World! - debug
Customer 1
Customer 2
Customer 3
Customer 4
Customer 5
dotnet run -c Release
Hello, World! - release
Emma Hansen
Lars Jensen
Nina Olsen
Erik Svensson
Anna Larsson
Morten Pedersen
Kari Nilsen
Olof Karlsson
Sofie Andersen
Henrik Johansen
Mia Berg
Johan Hansen
Ingrid Larsen
Fredrik Eriksson
Camilla Petersen
Ole Kristiansen
Sara Nilsson
Anders Madsen
Lene Olsen
Mikael Johansson
Aino Virtanen
Juhani Nieminen
Kaisa Korhonen
Mikko Laine
Liisa Heikkinen
Pekka Mäkelä
Sanna Salminen
Antti Koskinen
Marja Lehtinen
Jari HämäläinenI Test skal du skrive en test der tester at kunderne bliver hentet korrekt fra databasen. Du skal skrive en test der hedder WhenUsingMockDataAccessServiceAreWeGettingFiveCustomers og som tester at der bliver hentet 5 kunder fra mock-datakilden. Her kan du blot oprette en instans af MockDataAccessService og kalde GetAllCustomers metoden. Du kan derefter sammenligne antallet af kunder der bliver hentet med det forventede antal kunder (5).
Når du kører dotnet test i Test skal de (nu) 2 tests køre uden fejl og vise at alt er godt.
dotnet test -l "console;verbosity=detailed"
Restore complete (0,6s)
ProsaOpg.Types succeeded (0,1s) → C:\temp\prosa-opg\ProsaOpg.Types\bin\Debug\net9.0\ProsaOpg.Types.dll
ProsaOpg.Data succeeded (0,3s) → C:\temp\prosa-opg\ProsaOpg.Data\bin\Debug\net9.0\ProsaOpg.Data.dll
ProsaOpg.Test succeeded (0,7s) → bin\Debug\net9.0\ProsaOpg.Test.dll
A total of 1 test files matched the specified pattern.
C:\temp\prosa-opg\ProsaOpg.Test\bin\Debug\net9.0\ProsaOpg.Test.dll
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 9.0.2)
[xUnit.net 00:00:00.00] xUnit.net VSTest Adapter v2.8.2+699d445a1a (64-bit .NET 9.0.2)
[xUnit.net 00:00:00.15] Discovering: ProsaOpg.Test
[xUnit.net 00:00:00.15] Discovering: ProsaOpg.Test
[xUnit.net 00:00:00.19] Discovered: ProsaOpg.Test
[xUnit.net 00:00:00.19] Discovered: ProsaOpg.Test
[xUnit.net 00:00:00.19] Starting: ProsaOpg.Test
[xUnit.net 00:00:00.19] Starting: ProsaOpg.Test
[xUnit.net 00:00:00.26] Finished: ProsaOpg.Test
[xUnit.net 00:00:00.26] Finished: ProsaOpg.Test
Passed ProsaOpg.Test.AllTests.WhenUsingMockDataAccessServiceAreWeGettingFiveCustomers [15 ms]
Passed ProsaOpg.Test.AllTests.IsCreatedDateCorrectWhenCreatingANewCustomer [< 1 ms]
Test Run Successful.
Total tests: 2
Passed: 2
Total time: 1,3580 Seconds
ProsaOpg.Test test succeeded (2,0s)
Test summary: total: 2; failed: 0; succeeded: 2; skipped: 0; duration: 2,0s
Build succeeded in 4,4sBemærk at der køres to tests nu.
Når du er færdig med opgaven skal enten sende mig et link til dit eget offentlige repository, hvor du har uploadet løsningen - men du kan også bare sende mig en mail (michell@cronberg.dk) hvor du inkludere filerne Program.cs og AllTests.cs. Jeg behøver ikke de andre filer, da de ikke ændres.
Herefter kigger jeg på din løsning og sender dig feedback eller et bevis på at opgaven er bestået.