14

Chcę przeprowadzić test integracji moich repozytoriów.Integracja testowanie struktury encji - oddzielenie wywołania metody seed tylko dla PROD -

Chcę ustawić i wstawić dane testowe przed każdą metodą testu integracji. Następnie chcę wykonać logikę mojego repozytorium Następnie chcę potwierdzić, że logika działa, zwracając poprawne dane z bazy danych.

Nie chcę kpić i testować jednostki DbSet ;-) tylko prawdziwe testy integracyjne.

Moje pytanie dotyczy całej konfiguracji bazy danych i czyszczenia danych testowych.

używam kodu pierwsze podejście generujący TestDatabase i ProdDatabase. W ProdDatabase I seed rzeczywistych danych do gry, a następnie z nim w interfejsie użytkownika i sprawdzić prawidłowe zachowanie. TestDatabase służy tylko do testów integracyjnych.

Obie bazy danych są tworzone z kontekstu ONE.

Po zmianie dowolnej własności podmiotu i uruchomieniu testów integracyjnych wywoływana jest również nadpisana metoda Seed z mojego DbContext. Ale nie chcę tego dla mojego TestDatabase.

Jak mogę oddzielić wywołanie Seed tylko dla mojego ProdDatabase? A moja TestDatabase generuje własne "seed"/dane konfiguracji na test?

+0

którego używasz "IDatabaseInitializer"? – jjj

+0

The CreateDatabaseAlways. – Pascal

+0

Nawet w produkcji? – jjj

Odpowiedz

6

W każdym przypadku można set a differentIDatabaseInitializer lub DbMigrationsConfiguration (jeśli używasz MigrateDatabaseToLatestVersion dla inicjatora) podczas uruchamiania aplikacji:

System.Data.Entity.Database.SetInitializer(new TestOrProdInitializer()); 

Można nawet ustawić inicjator bazy danych przy użyciu różnych configuration file settings dla produkcji vs. Test:

<contexts> 
    <context type=" Blogging.BlogContext, MyAssembly"> 
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" /> 
    </context> 
</contexts> 

Jeśli trzeba reseedować po spadku Wyślij polecenie ping do bazy danych, możesz także wymusić inicjowanie przy użyciu dbContext.Database.Initialize(true).

+0

jak mogę wymusić utworzenie bazy danych za pomocą C# ZANIM zajrzę do kontekstu? Myślałem, że context.Database.Initialize (true) to robi, ale po uruchomieniu kodu baza danych nadal ma stare dane, więc nie została usunięta. – Pascal

+0

można spróbować "context.Database.Delete"? chociaż technicznie powinien już być wywołany (zobacz [to] (https://msdn.microsoft.com/en-us/library/gg679506 (v = vs.113) .aspx)). Może mógłbyś nazwać SetInitializer tuż przed wywołaniem inicjowania. – jjj

+0

, ale context.Database.Delete nie tworzy bazy danych, gdy wykonuję ctx.database.Initialize (true). – Pascal

Powiązane problemy