mam oceniający testy jednostkowe używając EF6 w połączeniu zTesty jednostkowe z wysiłku i SQL CE równolegle nie
- http://effort.codeplex.com/ i
- SQL Server CE (lokalnego pliku DB)
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
'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? –
@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
[Zobacz także] (http://stackoverflow.com/questions/30730224/running-code-on-assembly-load-in-xunit/30730225) – AlexFoxGill