Linq-Entities (EF4)와 Linq-to-Objects 간의 잠재적 인 차이로 인해 실제 쿼리를 사용하여 쿼리 클래스가 데이터를 검색하는지 확인해야합니다 올바르게 EF에서. SQL CE 4는 이것에 대한 완벽한 도구 인 것처럼 보이지만 몇 가지 딸꾹질이 있습니다. 이 테스트는 MsTest를 사용합니다.기능 테스트를 위해 SQL CE 4 데이터베이스를 사용하는 방법
데이터베이스가 모델 변경으로 인해 다시 생성되지 않으면 각 테스트 후에 데이터가 제거되지 않고 데이터가 데이터베이스에 계속 추가됩니다. 이로 인해 테스트에서 충돌이 발생할 수 있으며 의도 한 것보다 많은 데이터가 쿼리에서 반환됩니다.
첫 번째 아이디어는 TestInitialize
메서드에서 TransactionScope
을 초기화하고 트랜잭션을 TestCleanup
에 처리하는 것이 었습니다. 아쉽게도 SQL CE4는 트랜잭션을 지원하지 않습니다.
내 생각에 TestCleanup
의 데이터베이스를 File.Delete()
호출을 통해 삭제하는 것이 었습니다. 첫 번째 테스트의 TestCleanup
이 데이터베이스를 삭제하는 것으로 보이지만 첫 번째 테스트 이후의 모든 테스트는 데이터베이스를 다시 만들지 않는 것으로 보이므로 불행히도 이것은 첫 번째 테스트가 실행 된 후에 작동하지 않는 것으로 보입니다. 따라서 데이터베이스 파일을 찾을 수 없습니다.
ClassInitialize
및
ClassCleanup
에
TestInitialize
및
TestCleanup
태그를 변경하려고 시도했지만 그 때문에 이전에
ClassInitialize
이 (정도가 나타납니다 실행 테스트에
NullReferenceException
에 오류가 발생한.
ClassInitialize
은 어쩌면 그건 기본 클래스에 그것을 일으키는 것).
SQL CE를 효과적으로 테스트하는 방법이 부족합니다. 누구든지 더 좋은 아이디어가 있습니까?
편집 : 해결책을 찾아 냈습니다. 내 EF 유닛 테스트 기본 클래스에서 데이터 컨텍스트의 새 인스턴스를 시작한 다음
context.Database.Delete()
및
context.Database.Create()
을 호출합니다. 단위 테스트는 조금 느려지지만, 지금은 단위 테스트를 효율적으로 실제 데이터베이스
최종 편집 사용 할 수 있습니다 앞뒤로 마이크로 소프트와 일부 이메일 후를, 그것은
TransactionScope
의 지금 SQLCE에서 허용되는 것으로 나타났다 SqlCE의 최신 릴리스와 함께. 그러나 EF4를 사용하는 경우 트랜잭션을 시작하기 전에 명시 적으로 데이터베이스 연결을 열어야한다는 점에서 몇 가지 제한 사항이 있습니다.
System.Data.Entity.Database.DbDatabase.SetInitializer<YourEntityFrameworkClass>(
new System.Data.Entity.Database.DropCreateDatabaseAlways<YourEntityFrameworkClass>());
이 엔티티 프레임 워크는 항상 다시하게됩니다 : 당신의 TestInitialize
다음을 수행해야합니다에서
[TestMethod]
public void My_SqlCeScenario()
{
using (var context = new MySQLCeModelContext()) //ß derived from DbContext
{
ObjectContext objctx = ((IObjectContextAdapter)context).ObjectContext;
objctx.Connection.Open(); //ß Open your connection explicitly
using (TransactionScope tx = new TransactionScope())
{
var product = new Product() { Name = "Vegemite" };
context.Products.Add(product);
context.SaveChanges();
}
objctx.Connection.Close(); //ß close it when done!
}
}
물론 SQL CE는 트랜잭션을 지원하지만 TransactionScope를 사용하는 것은 매우 잘못된 방법입니다. 그냥 Connection 객체를 통해 정상적으로 처리하면됩니다. – leppie
'SaveChanges()'를 호출하지 않는 한,'TransactionScope'가없는 EF4 엔티티의 경우 확실하지 않습니다. 이는 테스트가 유효한 테스트가 아님을 의미합니다. – KallDrexx
Sql CE로 데이터를 시드하는 방법에 대한 예제를 제공 할 수 있습니까? 나는 EF6을 사용하여 SQL ce –