gpt4 book ai didi

c# - 使用 Asp.Net Boilerplate 进行单元测试时获取新的 DbContext

转载 作者:太空宇宙 更新时间:2023-11-03 13:13:21 24 4
gpt4 key购买 nike

我正在开发一个基于 Asp.Net Boilerplate 的项目,现在我必须使用具有真实数据库连接(无模拟)的真实存储库对服务进行单元测试。我一直在使用 BringerOd 的最后一篇文章 https://gist.github.com/hikalkan/1e5d0f0142484da994e0作为设置我的 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 block 中设置我的 UnitOfWorkScope。但是,我真的不想在每个测试中重复该逻辑。有谁知道如何手动获得 using block 的效果,以便我每次都能获得全新的 DbContext?

最佳答案

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

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

如链接文档中所述,这样做的原因是

When you call GetAll() out of a repository method, there must be an open database connection. This is because of deferred execution of IQueryable<T>. It does not perform database query unless you call ToList() method or use the IQueryable<T> in a foreach loop (or somehow access to queried items). So, when you call ToList() method, database connection must be alive. This can be achieved by marking caller method with the [UnitOfWork] attribute of ASP.NET Boilerplate. Note that Application Service methods are already using [UnitOfWork] as default, so, GetAll() will work without adding the [UnitOfWork] attribute for application service methods.

关于c# - 使用 Asp.Net Boilerplate 进行单元测试时获取新的 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27539562/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com