运行单元测试时遇到异常“ System.ObjectDisposedException”。
在应用程序层中,代码如下。
//Interface definition
public interface IAnalysisDataQuerier{
DataTable GetDataTableWithQueryCondition(int windmillId, int partsId, int[] analysisItemIds, DateTime? starTime, DateTime? endTime);
}
接下来,我实现下面的接口,在这里我使用依赖注入方法(Castle Windsor)来初始化IbCollectionInfo存储库。
//Implement
public class AnalysisDataQuerier : IAnalysisDataQuerier, ITransientDependency
{
... ...
private readonly IRepository<IbCollectionInfo> _ibCollectionInfoRepository;
public AnalysisDataQuerier(
IRepository<IbCollectionInfo> ibCollectionInfoRepository)
{
_ibCollectionInfoRepository = ibCollectionInfoRepository;
}
... ...
public DataTable GetDataTableWithQueryCondition(int windmillId, int partsId, int[] analysisItemIds, DateTime? starTime, DateTime? endTime)
{
DataTable dt = new DataTable();
//Error happens at the below codes.
var collectionInfoList = _ibCollectionInfoRepository.GetAll()
.WhereIf(starTime != null, a => a.CollectionDate >= starTime)
.WhereIf(endTime != null, a => a.CollectionDate <= endTime)
.Where(a => a.BiWindmillInfoId.Equals(windmillId) && a.BiWindmillPartsInfoId.Equals(partsId)).ToList();
......
}
}
然后,我在下面的Test项目中设计一个测试代码。
public class TestQueryImportedExcelData: AppTestBase
{
private readonly IAnalysisDataQuerier _analysisDataQuerier;
public TestQueryImportedExcelData()
{
_analysisDataQuerier = Resolve<IAnalysisDataQuerier>();
}
[Fact]
public void TestQueryFunction()
{
DataTable dt = _analysisDataQuerier.GetDataTableWithQueryCondition(2, 1, new[] {3,4,5,8,1003,1004},null,null);
foreach (DataRow dr in dt.Rows)
{
... ...
}
}
}
然后,我运行上面的单元测试,该错误发生在我的实现代码中。
var collectionInfoList = _ibCollectionInfoRepository.GetAll()
错误消息如下。
System.ObjectDisposedException:“无法访问已处置的对象。导致此错误的常见原因是处理已解决的上下文 从依赖注入,然后稍后尝试使用相同的 应用程序中其他位置的上下文实例。如果您可能会发生这种情况 在上下文上调用Dispose()或将上下文包装在 使用语句。如果使用依赖注入,则应让 依赖项注入容器负责处理上下文 实例。”
stacktrace消息是:
在Microsoft.EntityFrameworkCore.DbContext.CheckDisposed()
在Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
在Microsoft.EntityFrameworkCore.DbContext.get_Model()
在Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.get_EntityType() at Microsoft.EntityFrameworkCore.Internal.InternalDbSet
1.get_EntityQueryable() 在Microsoft.EntityFrameworkCore.Internal.InternalDbSet1.System.Collections.Generic.IEnumerable<TEntity>.GetEnumerator() at System.Linq.Enumerable.WhereEnumerableIterator
1.ToList()
在System.Linq.Enumerable.ToList [TSource](IEnumerable`1源)
在... ...
我确定我的代码中没有异步方法。 因此,您能给我一个解决该问题的解决方案吗。
答案 0 :(得分:0)
好...我知道这个问题的关键,因为ABP框架通过使用其工作单元系统管理数据库连接和事务,并且如果类继承了默认****,则自动执行所有这些操作域层或应用程序层中的AppServiceBase类。
由于我的类未继承**** AppServiceBase类,因此应如下所示将UnitOfWork属性显式附加到我的函数中。
[UnitOfWork]
public DataTable GetDataTableWithQueryCondition(int windmillId, ...)
它可以在没有System.ObjectDisposedException异常的情况下工作。