나는 지속성 성 액티브를 사용하고, 나는 다음 할 것입니다 내 지속성 테스트를위한 기본 클래스 작성하려고 해요 : 각 테스트 케이스에 대한NHibernate 세션을 플러시하고 트랜잭션을 커밋하지 않고 새 세션을 가져올 수 있습니까?
- 열기 거래를하고 다시 그것을 롤 결국 테스트 케이스의 끝 부분을 제거해야하므로 각 테스트 케이스별로 스키마를 다시 만들지 않고도 각 테스트 케이스에 대해 깨끗한 DB를 얻을 수있다.
- 내 NHibernate 세션을 비우고 테스트 도중 새 NHibernate 세션을 가져 오는 기능을 제공합니다. 따라서 지속성 작업이 NHibernate 세션이 아닌 DB에 실제로 도달했음을 알 수 있습니다.
내 기본 클래스 (ARTestBase
)가 작동하고 있음을 증명하기 위해 다음 샘플 테스트를 준비했습니다.
[TestFixture]
public class ARTestBaseTest : ARTestBase
{
[Test]
public void object_created_in_this_test_should_not_get_committed_to_db()
{
ActiveRecordMediator<Entity>.Save(new Entity {Name = "test"});
Assert.That(ActiveRecordMediator<Entity>.Count(), Is.EqualTo(1));
}
[Test]
public void object_created_in_previous_test_should_not_have_been_committed_to_db()
{
ActiveRecordMediator<Entity>.Save(new Entity {Name = "test"});
Assert.That(ActiveRecordMediator<Entity>.Count(), Is.EqualTo(1));
}
[Test]
public void calling_flush_should_make_nhibernate_retrieve_fresh_objects()
{
var savedEntity = new Entity {Name = "test"};
ActiveRecordMediator<Entity>.Save(savedEntity);
Flush();
// Could use FindOne, but then this test would fail if the transactions aren't being rolled back
foreach (var entity in ActiveRecordMediator<Entity>.FindAll())
{
Assert.That(entity, Is.Not.SameAs(savedEntity));
}
}
}
여기는 기본 클래스에서 최선의 노력입니다. 정확하게 Flush()
을 구현하므로 세 번째 테스트 케이스가 통과합니다. 그러나 트랜잭션을 롤백하지 않으므로 두 번째 테스트가 실패합니다.
public class ARTestBase
{
private SessionScope sessionScope;
private TransactionScope transactionScope;
[TestFixtureSetUp]
public void InitialiseAR()
{
ActiveRecordStarter.ResetInitializationFlag();
ActiveRecordStarter.Initialize(typeof (Entity).Assembly, ActiveRecordSectionHandler.Instance);
ActiveRecordStarter.CreateSchema();
}
[SetUp]
public virtual void SetUp()
{
transactionScope = new TransactionScope(OnDispose.Rollback);
sessionScope = new SessionScope();
}
[TearDown]
public virtual void TearDown()
{
sessionScope.Dispose();
transactionScope.Dispose();
}
protected void Flush()
{
sessionScope.Dispose();
sessionScope = new SessionScope();
}
[TestFixtureTearDown]
public virtual void TestFixtureTearDown()
{
SQLiteProvider.ExplicitlyDestroyConnection();
}
}
메모리 내장 데이터베이스가있는 사용자 지정 SQLite 공급자를 사용하고 있습니다. 내 사용자 지정 공급자 (this blog post에서 가져옴)는 스키마를 유지 관리하기 위해 항상 연결을 유지합니다. 이 제거하고 일반 SQL Server 데이터베이스를 사용하여 동작을 변경하지 마십시오.
필요한 동작을 수행 할 수있는 방법이 있습니까?