fbpx

Testy i baza danych – implementacja

Opublikowane przez Jerzy Wickowski w dniu

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ć.



Czy to był wartościowy artykuł? Zapisz się, a wyślę Ci dwa ebooki o czystym kodzie oraz będę informował Cię o nowych postach

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 […]

Dodaj komentarz

Twój adres email nie zostanie opublikowany.

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.


    Zapisz się

    Wyślę Ci dwa dokumenty mówiące o jakości kodu. Dodatkowo będę Cię informował o nowych postach i nowościach.