【发布时间】:2020-09-23 07:01:51
【问题描述】:
我从 Microsoft 关于使用 moq 测试 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' 的测试替身必须提供所使用的方法和属性的实现。'
我错过了什么吗?
更新: 使用起订量 4.10.1、EF 6.2.0、VS 社区 2019 16.6.1、.NET 4.7.2
【问题讨论】:
-
我建议您坚持链接文档中显示的内容。无论如何都不需要在设置的早期访问模拟对象
-
嗯...这很可能是因为模拟创建对象使用延迟初始化,当您调用对象时,一旦创建它就想再次创建它。初始化负责 DynamicProxy 创建,因此您添加的任何其他接口都不会被“模拟”...
标签: c# entity-framework linq moq