[英]moq.As<>().Setup() does not seem to work after getting moq.Object
我从 Microsoft 关于使用 moq 测试 EF 的文章中得出一个小测试: 使用 mocking 框架进行测试
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:使用最小起订量 4.10.1、EF 6.2.0、VS 社区 2019 16.6.1、.NET 4.7.2
您实际上需要创建 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
问题是您在获得模拟的 object ( mockSet.Object
) 的实例后添加IQueryable<T>
设置; 它不起作用,这也是为什么一旦您将分配注释到a
后它就可以正常工作的原因。 为要使用的行为添加设置后,您应该只检索模拟的 object。
有趣的是,一旦您添加了这些设置,您就可以随时更改它们(使用另一个设置覆盖)。 您只需在检索模拟的 object 之前进行初始注册。 我一直用我的系统模拟库来做这件事。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.