gpt4 book ai didi

c# - 模拟单元测试在 AsNoTracking() 上返回 ArgumentNullException

转载 作者:行者123 更新时间:2023-11-30 16:50:58 24 4
gpt4 key购买 nike

我已经设置了模拟数据库集,它读取一堆 json 文件并将它们反序列化为模拟数据库集。我将 AsNoTracking 添加到我的变量中有两个原因:1) 我将在数据库中存储一个新对象,并且不需要在更新条目时跟踪该对象。2) 性能。

代码工作正常,但是模拟不起作用,因为我添加了 AsNoTracking() 方法以不将结果存储在 dbcontext 缓存中。现在返回一个 ArgumentNullException。如果我删除 AsNoTracking 测试通过,但是我不想仅仅为了通过单元测试而被迫删除 AsNoTracking。

调试我的单元测试时,它会在此处抛出 ArugmentNullException:

var myObj = dbContext.MyTable.AsNoTracking().Where(b => b.Id == param.Id).Include(b => b.Column1).Include(b => b.Column2).Include(b => b.Colum3).FirstOrDefault();

但是,如果通过浏览器运行,它工作正常,数据返回正确,对象不为空。

public Mock<DbSet<T>> GetMockDbSet<T>(string path) where T : class
{
var data = GetObjectList<T>(path).AsQueryable();

var mockSet = new Mock<DbSet<T>>();
mockSet.As<IQueryable<T>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<T>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<T>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<T>>().Setup(m => m.GetEnumerator()).Returns(()=>data.GetEnumerator());

return mockSet;

}

如果将 AsNoTracking() 添加到从 dbset 返回对象的 var 中,我是否可以对上面的代码做任何事情以使结果不为空。

最佳答案

我找到了答案。这可以通过模拟 asnotracking 以返回您想要的集合来完成,如下所示:

我在模拟 EntityA,一旦我在设置上完成所有反序列化和模拟,我就模拟 AsNoTracking:

例子:

entityA.Setup(x => x.AsNoTracking()).Returns(entityA.Object);

关于c# - 模拟单元测试在 AsNoTracking() 上返回 ArgumentNullException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34265739/

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