Я встречаюсь с исключением "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)
в ... ...
Я уверен, что в моем коде нет асинхронного метода.Итак, не могли бы вы дать мне решение отклонить проблему.