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

C# 模拟单元测试在AsNoTracking()上返回ArgumentNullException,c#,entity-framework,unit-testing,mocking,moq,C#,Entity Framework,Unit Testing,Mocking,Moq,我已经设置了mockdbset,它读取一组json文件,并将它们反序列化为mockdbset。我将AsNoTracking添加到变量中有两个原因: 1) 我将在数据库中存储一个新对象,不需要在更新条目时跟踪该对象。 2) 表演 代码运行良好,但是模拟不起作用,因为我添加了AsNoTracking()方法,不将结果存储在dbcontext缓存中。现在返回一个ArgumentNullException。如果我删除AsNoTracking测试通过,但是我不想仅仅为了通过单元测试而被迫删除AsNoTra

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

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

调试我的单元测试时,会在此处引发异常:

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;

        }
public Mock GetMockDbSet(字符串路径),其中T:class
{
var data=GetObjectList(path).AsQueryable();
var mockSet=new Mock();
mockSet.As().Setup(m=>m.Provider).返回(data.Provider);
mockSet.As().Setup(m=>m.Expression).Returns(data.Expression);
mockSet.As().Setup(m=>m.ElementType).Returns(data.ElementType);
mockSet.As().Setup(m=>m.GetEnumerator())。返回(()=>data.GetEnumerator());
返回模拟集;
}

如果将AsNoTracking()添加到从dbset返回对象的var中,我可以对上面的代码做些什么以使结果不为null。

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

我在模仿EntityA,一旦我在设置中进行了所有的反序列化和模仿,我就会模仿AsNoTracking:

例如:

entityA.Setup(x => x.AsNoTracking()).Returns(entityA.Object);
另见(国际海事组织更清楚一些)。