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

本文关键字:返回 ArgumentNullException 单元测试 AsNoTracking 模拟 | 更新日期: 2023-09-27 18:26:51

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

代码运行良好,但mocking不起作用,因为我添加了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()上返回ArgumentNullException

我找到了答案。这可以通过嘲笑asnotracking来返回您想要的集合来实现,如下所示:

我在嘲笑EntityA,一旦我完成了所有的反序列化和设置上的嘲笑,我就会嘲笑AsNoTracking:

示例:

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