moq.As <>()。获取Moq.Object后,Setup()似乎不起作用

问题描述 投票:0回答:2

[我从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]

c# entity-framework linq moq
2个回答
0
投票

您的代码在我当前的设置(EF core 2.2和Moq 4.13.1)上工作,您使用的是EF版本?文章说:

仅适用于EF6及更高版本-本页中讨论的功能,API等是在Entity Framework 6中引入的。如果使用的是较早版本,则部分或全部信息将不适用。


0
投票

您实际上还需要创建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 
© www.soinside.com 2019 - 2024. All rights reserved.