Unit testing 如何模拟数据库模型?

Unit testing 如何模拟数据库模型?,unit-testing,moq,asp.net-mvc-5,entity-framework-6,Unit Testing,Moq,Asp.net Mvc 5,Entity Framework 6,我正在尝试测试存储库,因此需要模拟模型容器。实际上,我所需要的是能够在BlogRepository中设置返回到GetBlogs()的博客。存储库代码为: private BlogWebsiteModelContainer context; public BlogRepository(BlogWebsiteModelContainer context) { this.context = context; } public IEnumerable<Blog> GetBlogs

我正在尝试测试存储库,因此需要模拟模型容器。实际上,我所需要的是能够在BlogRepository中设置返回到GetBlogs()的博客。存储库代码为:

private BlogWebsiteModelContainer context;

public BlogRepository(BlogWebsiteModelContainer context)
{
    this.context = context;
}

public IEnumerable<Blog> GetBlogs()
{
    return context.Blogs;
}
但我在调试时收到以下错误消息:

非虚拟(在VB中可重写)成员上的设置无效:m=>m.Blogs


非常感谢您的帮助。

为您的BlogWebItemodelContainer创建一个界面,然后模拟该界面。另外,不要将界面上的
Blog
s定义为
DbSet
而是将其定义为
IQuerayable

然后,您可以创建一个列表并使用
.AsQueryable
扩展名:

var contextMock = new Mock<IBlogWebsetModelContainer>();
var mockBlogSet = new List<Blog>();
contextMock.Setup(m => m.Blogs).Returns(mockBlogSet.AsQueryable());
blogRepo = new BlogRepository(contextMock.Object);
var contextMock=new Mock();
var mockBlogSet=新列表();
Setup(m=>m.Blogs).Returns(mockBlogSet.AsQueryable());
blogRepo=新的BlogRepository(contextMock.Object);

我在这个链接上找到了答案。因此,我的代码如下所示:

var mockBlogSet = new Mock<DbSet<Blog>>();
context.Setup(m => m.Blogs).Returns(mockBlogSet.Object);
blogRepo = new BlogRepository(context.Object);
List<Blog> blogs = new List<Blog> 
{ 
    new Blog() { Id = 1 },
    new Blog() { Id = 2 },
    new Blog() { Id = 3 },
};

var data = blogs.AsQueryable();

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());

var mockContext = new Mock<BlogWebsiteModelContainer>();
mockContext.Setup(c => c.Blogs).Returns(mockSet.Object);

blogRepo = new BlogRepository(mockContext.Object);
List blogs=新列表
{ 
新建博客(){Id=1},
新建博客(){Id=2},
新建博客(){Id=3},
};
var data=blogs.AsQueryable();
var mockSet=new Mock();
mockSet.As().Setup(m=>m.Provider).返回(data.Provider);
mockSet.As().Setup(m=>m.Expression).Returns(data.Expression);
mockSet.As().Setup(m=>m.ElementType).Returns(data.ElementType);
mockSet.As().Setup(m=>m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext=new Mock();
Setup(c=>c.Blogs).Returns(mockSet.Object);
blogRepo=新的BlogRepository(mockContext.Object);
然后,我不得不进入我的BlogWebItemOdelContainer类并更改:

public DbSet<Blog> Blogs { get; set; }
公共数据库集博客{get;set;}

公共虚拟数据库集博客{get;set;}
只需在中添加
虚拟
。这一切都奏效了


快速提示:首先创建列表,然后将其设置为
。AsQueryable()
的原因是,在我的代码中,我将原始博客列表分开,以便在测试中进行比较。

我尝试了您的解决方案,但它对我来说并不奏效。创建界面并不简单,可能是因为我的项目有些复杂。你确实用AsQueryable()点让我走上了正确的道路。谢谢
public virtual DbSet<Blog> Blogs { get; set; }