[我从Microsoft的文章中得到了一个小测试,该测试涉及用最小起订量来测试EF:Testing with a mocking framework
namespace TestingDemo
{
public class BloggingContext : DbContext
{
public virtual DbSet<Blog> Blogs { get; set; }
}
public class Blog
{
public string Name { get; set; }
}
[TestClass]
public class QueryTests
{
[TestMethod]
public void Test()
{
var data = new List<Blog> { new Blog { Name = "AAA" } }.AsQueryable();
var mockSet = new Mock<DbSet<Blog>>();
//var a = mockSet.Object;
mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
var b = mockSet.Object.ToList();
}
}
}
直到我取消注释var a = mockSet.Object;
行之前,它都可以正常工作之后,我在行var b = mockSet.Object.ToList();
System.NotImplementedException:'成员'IEnumerable.GetEnumerator'尚未在继承自'DbSet`1'的类型'DbSet`1Proxy'上实现。 'DbSet`1'的测试双精度必须提供所使用的方法和属性的实现。'
我想念什么吗?
UPD:使用Moq 4.10.1,EF 6.2.0,VS社区2019 16.6.1,.NET 4.7.2]
您的代码在我当前的设置(EF core 2.2和Moq 4.13.1)上工作,您使用的是EF版本?文章说:
仅适用于EF6及更高版本-本页中讨论的功能,API等是在Entity Framework 6中引入的。如果使用的是较早版本,则部分或全部信息将不适用。
您实际上还需要创建DbContext模拟,以及:
var context = new Mock<BloggingDbContext>();
var mockSet = new Mock<DbSet<Blog>>();
mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
context.Setup(c => c.Blogs).Returns(mockSet.Object);
var blogs = context.Object.Blogs.ToList(); // usage