繁体   English   中英

moq.As<>().Setup() 在得到 moq.Object 后似乎不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM