System.ObjectDisposedException возникает при запуске модульного теста в платформе ABP - PullRequest
0 голосов
/ 25 августа 2018

Я встречаюсь с исключением "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();
            ......
        }
    }

Затем я создаю тестовый код в своем тестовом проекте, как показано ниже.

 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 () для контекста или заключаете контекст в оператор using.Если вы используете внедрение зависимостей, вы должны позволить контейнеру внедрения зависимостей позаботиться об удалении экземпляров контекста. ”

Сообщение трассировки стека:

в Microsoft.EntityFrameworkCore.DbContext.CheckDisposed ()
в Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies ()
в Microsoft.EntityFrameworkCore.DbContext.get_Model ()
в Microsoft.EntityFramework_Intern_Reader.InternityEgn.InEв 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 голосов
/ 29 августа 2018

Хорошо ... Я знал ключ этой проблемы, потому что платформа ABP управляет соединениями с базой данных и транзакциями, используя свою систему единиц работы, и делает все это автоматически, если класс унаследовал значение по умолчанию ****Класс AppServiceBase на уровне домена или на уровне приложения.

Поскольку мой класс не наследовал класс AppServiceBase ****, я должен явно добавить атрибут UnitOfWork к своей функции, как показано ниже.

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

Работает без исключения System.ObjectDisposedException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...