在ABP框架中运行单元测试时,发生System.ObjectDisposedException

时间:2018-08-25 11:00:30

标签: c# unit-testing exception xunit

运行单元测试时遇到异常“ 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.InternalDbSet 1.get_EntityType() at Microsoft.EntityFrameworkCore.Internal.InternalDbSet 1.get_EntityQueryable()   在Microsoft.EntityFrameworkCore.Internal.InternalDbSet 1.System.Collections.Generic.IEnumerable<TEntity>.GetEnumerator() at System.Linq.Enumerable.WhereEnumerableIterator 1.ToList()
  在System.Linq.Enumerable.ToList [TSource](IEnumerable`1源)
  在... ...

我确定我的代码中没有异步方法。 因此,您能给我一个解决该问题的解决方案吗。

1 个答案:

答案 0 :(得分:0)

好...我知道这个问题的关键,因为ABP框架通过使用其工作单元系统管理数据库连接和事务,并且如果类继承了默认****,则自动执行所有这些操作域层或应用程序层中的AppServiceBase类。

由于我的类未继承**** AppServiceBase类,因此应如下所示将UnitOfWork属性显式附加到我的函数中。

[UnitOfWork]
public DataTable GetDataTableWithQueryCondition(int windmillId, ...)

它可以在没有System.ObjectDisposedException异常的情况下工作。