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

时间:2015-12-14 11:20:05

标签: c# entity-framework unit-testing mocking moq

我已经设置了mock dbset,它读取了一堆json文件并将它们反序列化为模拟dbset。我已将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中,结果不为null。

1 个答案:

答案 0 :(得分:2)

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

我在嘲笑EntityA,一旦我做了所有反序列化和模拟设置我就嘲笑AsNoTracking:

示例:

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