Testy i baza danych – implementacja

Poprzednio opisałem genezę i założenia podejścia do testów z bazą danych. Pojawiła się tam tajemnicza klasa IsTableBusyDatabaseTest. Dzisiaj zgłębimy jej szczegóły implementacyjne. Opiszę jak zaimplementować przykładową klasę bazową do testów z bazą danych.
Klasa bazowa dla testów
Jest to klasa bazowa, dla wszystkich testów używających bazy danych, z mojej małej aplikacji do piłkarzyków. Dziedziczy ona po abstrakcyjnej klasie DatabaseTest. Wymaga ona zaimplementowania dwóch właściwości DatabaseCreator i DatabaseRemover. Dodatkowo w konstruktorze tworzę instancję kontekstu, który będzie używany podczas testów.
public class IsTableBusyDatabaseTest: DatabaseTest, IDisposable { protected Context context; public IsTableBusyDatabaseTest() : base("DefaultConnection") { context = new Context(); } public override void Dispose() { context.Dispose(); base.Dispose(); } protected override DatabaseCreator DatabaseCreator => new IsTabeBusyDatabaseTool(); protected override DatabaseRemover DatabaseRemover => new IsTabeBusyDatabaseTool(); }
Tworzenie i usuwanie
Nazwy tych interfejsów mówią prawie wszystko o sobie. Ich odpowiedzialnością jest odpowiednie tworzenie i usuwanie bazy danych. Użyłem standardowych mechanizmów EntityFramework. Jednak nic nie szkodzi na przeszkodzie, aby użyć skryptów SQL, czy innego mechanizmu odtwarzania bazy. Natomiast klasa bazowa martwi się tym, aby były one odpalone w odpowiednim momencie. Przykładowa implementacja może wyglądać następująco:
public class IsTabeBusyDatabaseTool: DatabaseCreator, DatabaseRemover { public void Create(string connectionString) { var migrationConfiguration = new Configuration { TargetDatabase = new DbConnectionInfo(connectionString, "System.Data.SqlClient") }; Database.SetInitializer(new MigrateDatabaseToLatestVersion<context, configuration="">(true, migrationConfiguration)); using (var ctx = new Context(connectionString)) { ctx.Places.Take(1).ToList(); ctx.SaveChanges(); } } public void Remove(string connectionString) { Database.Delete(connectionString); } } </context,>
Zdaję sobie sprawę, że nie jest to rozwiązanie doskonałe. Jest to pierwszy szkic, co prawda działający, ale szkic. Jeżeli w przyszłości będę rozwijał ten kawałek kodu to z pewnością podzielę się tym na łamach bloga. Jeżeli masz jakieś sugestie, jakie mógłbym uwzględnić podczas udoskonalania, to proszę dać znać.
1 Komentarz
Testy z bazą danych – założenia | Jerzy Wickowski · 2020-01-09 o 13:31
[…] zapraszam do dyskusji. Jeżeli jesteś zainteresowany co kryje się głębiej to już zapraszam do następnej części. Jeżeli zastanawia się geneza tego rozwiązania to zapraszam do poprzedniej […]