【发布时间】:2014-11-21 20:32:17
【问题描述】:
我正在对基于实体框架的数据访问层(我知道它称为集成测试等)进行单元测试。我有超过 10 个测试,通常它们非常广泛,因为单个测试正在检查例如某个实体的整个 CRUD。当我一个一个运行它时,一切都很好。我刚刚运行了其中一项测试 7 次,结果总是积极的。但是当我同时运行所有测试时,其中大约一半会抛出以下异常:
System.Transactions.TransactionAbortedException : 事务有 中止。
这非常令人担忧,因为我担心频繁调用 DAL 可能会出现问题。
我正在使用 xUnit 1.9.2、VisualStudio 2012(带有 xUnit 测试运行器)和 Entity Framework 5.0.0。 DAL 使用 ODP.NET 提供程序连接到 Oracle 数据库。
编辑:
我的 DAL 包含以下交易处理方法:
protected SomeDb _context = new SomeDb(); //It's DbContext
protected TransactionScope _transactionScope;
public void BeginTransaction()
{
_transactionScope = new TransactionScope();
}
public void Rollback()
{
_transactionScope.Dispose();
}
另一方面,我的测试方法是这样的:
[Fact]
public void DAL_Entity_CRUD()
{
#region Arrange
IDataAccess _dataAccess = new DataAccess();
//Somecode
#endregion
#region Act
_dataAccess.BeginTransaction();
//Somecode
_dataAccess.Rollback();
#endregion
#region Assert
//Somecode
#endregion
}
不过我最近发现应该是这样的:
IDataAccess _dataAccess = new DataAccess();
try
{
_dataAccess.BeginTransaction();
//Some code
_dataAccess.Rollback();
}
catch
{
_dataAccess.Rollback();
throw;
}
我说的对吗?
无论如何,我的 DAL 实现了 IDisposable,据我所知,在测试方法结束时处理 TransactionScope 和 DbContext 时应该关闭事务...
~DataAccess()
{
this.Dispose(false);
}
protected bool Disposed { get; private set; }
public void Dispose()
{
// Dispose of unmanaged resources.
this.Dispose(true);
// Suppress finalization.
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!this.Disposed)
{
if (disposing)
{
// Perform managed cleanup here.
_transactionScope.Dispose();
_context.Dispose();
}
// Perform unmanaged cleanup here.
this.Disposed = true;
}
}
【问题讨论】:
-
你能不能四处挖掘,看看能不能找到更详细的错误?理想情况下,如果这将成为 Oracle 层或 Oracle 数据库的问题,我们希望看到一些 ORA 错误。
标签: c# entity-framework unit-testing odp.net xunit