2014-04-12 22 views
8

mam oceniający testy jednostkowe używając EF6 w połączeniu zTesty jednostkowe z wysiłku i SQL CE równolegle nie

http://www.codeproject.com/Articles/460175/Two-strategies-for-testing-Entity-Framework-Effort było całkiem dobrym referencją, ale teraz utknąłem.

Mam 2 projekty testowe (jeden dla Effort i drugi dla SQL CE). Jeśli używam obu oddzielnie, wszystko jest w porządku. Uruchamianie zarówno w jednym rzędzie z testerem ReSharper, jak i ostatnim testowym projektem zawsze kończy się niepowodzeniem. Albo

System.InvalidOperationException: Entity Framework był już za pomocą instancji DbConfiguration zanim podjęto próbę dodać „załadowany” obsługi zdarzenia. "Załadowane" programy obsługi zdarzeń można dodać tylko jako część uruchamiania aplikacji przed użyciem Entity Framework.

lub

System.InvalidOperationException: Domyślnym DbConfiguration instancja był używany przez Entity Framework zanim podjęto próbę ustawić wystąpienie przykład „SqlCeConfiguration'.The 'SqlCeConfiguration' musi być ustawione przy uruchamianiu aplikacji przed użyciem jakichkolwiek funkcji Entity Framework lub muszą być zarejestrowane w pliku konfiguracyjnym aplikacji.

To zawsze to samo. Następca dziedziczy instancję DbConfiguration od poprzednika. Jak mogę uruchomić oba projekty testowe/konfigurację bez skutków ubocznych?

Oto mój DbContext klasa:

public class DataContext : DbContext 
{ 
    public DataContext(string connectionString) : base(connectionString) 
    { Configuration.LazyLoadingEnabled = false; } 

    public DataContext(DbConnection connection) : base(connection, true) 
    { Configuration.LazyLoadingEnabled = false; } 
} 

To urządzenie Test z Effort:

[TestFixtureSetUp] 
public void TestFixtureSetup() 
{ 
    EffortProviderConfiguration.RegisterProvider(); 
    var connection = DbConnectionFactory.CreateTransient(); 
    var dbContext = new DataContext(connection); 
    ... 
} 

To urządzenie Test z SQL CE:

[TestFixtureSetUp] 
public void TestFixtureSetup() 
{ 
    const string filePath = @"LocalDb.sdf"; 
    var connectionString = string.Format("Data Source={0}; Persist Security Info=False;", filePath); 
    DbConfiguration.SetConfiguration(new SqlCeConfiguration()); 

    var dbContext = new DataContext(connectionString); 
    dbContext.Database.Create(); 
    ... 
} 

i MY SqlCeConfiguration:

public class SqlCeConfiguration : DbConfiguration 
{ 
    public SqlCeConfiguration() 
    { 
     SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance); 
     SetDefaultConnectionFactory(new SqlCeConnectionFactory("System.Data.SqlServerCe.4.0")); 
    } 
} 

Dziękuję bardzo!

Marcel

+0

'DbConfiguration.SetConfiguration()' metoda ogólnie pozwala jedynie na jednej 'DbConfiguration' za AppDomain. Czy próbowałeś ręcznie wstawić dostawcę do łańcucha połączenia, zamiast próbować ustawić go w kodzie? –

+0

@martin_costello Dzięki za podpowiedź. Niestety dostawca to "nieobsługiwane słowo kluczowe". Czy możesz podać przykładowy ciąg połączenia dla SQL CE Server? – Marcel

+0

[Zobacz także] (http://stackoverflow.com/questions/30730224/running-code-on-assembly-load-in-xunit/30730225) – AlexFoxGill

Odpowiedz

8

Byliśmy widząc te same błędy podczas uruchamiania wszystkich UnitTests na naszym serwerze kompilacji albo podczas jazdy wszystkie UnitTests lokalnie.

System.InvalidOperationException: Entity Framework był już przy użyciu instancji DbConfiguration, zanim podjęto próbę dodania obsługi zdarzeń "Załadowany" . "Załadowane" programy obsługi zdarzeń można dodać tylko jako część uruchamiania aplikacji przed użyciem Entity Framework.

Po przeniesieniu kodu rejestracji dostawcy wysiłku z metody [TestInitialize] do metody AssemblyInitialize wszystko zaczęło działać. Na podstawie komunikatu w zgłoszonym błędzie okazuje się, że rejestracja nie może się odbyć więcej niż jeden raz.

0

Natknąłem się właśnie na to i pomyślałem, że podzielę się przyczyną mojego problemu.

Wszystko działało doskonale, dopóki nie zaimplementowałem programu i ActionFilter. Okazało się, że w moim teście kod Effort był uruchomiony po utworzeniu mojej strony internetowej. Utworzenie strony internetowej zainicjowało mój filtr, mój filtr zażądał DataContext z kontenera.

Stąd ktoś już skorzystał z datacontext przed próbowałem skonfigurować go z wysiłku.

Nadzieja to może komuś pomóc w przyszłości, aczkolwiek to jest trochę z innej przyczyny, i mam nadzieję, że rozwiązał problem int koniec!