2

我正在开发一个基于 Asp.Net Boilerplate 构建的项目,现在我必须使用具有真实数据库连接(无模拟)的真实存储库对服务进行单元测试。我一直在使用https://gist.github.com/hikalkan/1e5d0f0142484da994e0中的 BringerOd 的最后一篇文章作为设置我的 UnitOfWorkScope 实例的指南。所以,我的代码目前看起来像这样:

IDisposableDependencyObjectWrapper<IUnitOfWork> _unitOfWork;

[TestInitialize]
public void SetUpService()
{
    //initialize service

    _unitOfWork = IocManager.Instance.ResolveAsDisposable<IUnitOfWork>();
    UnitOfWorkScope.Current = _unitOfWork.Object;
    UnitOfWorkScope.Current.Initialize(true);
    UnitOfWorkScope.Current.Begin();

}

[TestCleanup]
public void CleanUpService()
{
    UnitOfWorkScope.Current.Cancel();
    _unitOfWork.Dispose();
    UnitOfWorkScope.Current = null;
}

这就像第一个单元测试的魅力,但是当我尝试在第二个测试中进行存储库调用时,我得到:“操作无法完成,因为 DbContext 已被释放。”

我的猜测是,当 TestInitialize 方法再次运行时,工作单元范围被分配了相同的(已处理的)DbContext,而不是一个新的。我想,在我的实际测试方法中,我可以在带有 IUnitOfWork 的 using 块中设置我的 UnitOfWorkScope。但是,我真的不想在每个测试中重复这个逻辑。有谁知道如何手动获得 using 块的效果,以便我每次都获得一个全新的 DbContext ?

4

1 回答 1

1

检查:http ://aspnetboilerplate.com/Pages/Documents/Repositories

您必须使用 [UnitOfWork] 属性标记调用方法。

如链接文档中所述,其原因是

当您调用GetAll()存储库方法时,必须有一个打开的数据库连接。这是因为IQueryable<T>. ToList()除非您调用方法或IQueryable<T>在 foreach 循环中使用(或以某种方式访问​​查询的项目),否则它不会执行数据库查询。因此,当您调用ToList()方法时,数据库连接必须处于活动状态。这可以通过使用[UnitOfWork]属性标记调用方方法来实现ASP.NET Boilerplate。请注意,应用程序服务方法已[UnitOfWork]作为默认值使用,因此GetAll()无需添加[UnitOfWork]应用程序服务方法的属性即可工作。

于 2015-05-15T22:15:41.317 回答