【发布时间】:2017-05-12 20:12:41
【问题描述】:
我在 asp.net 核心中使用 xunit 和 Moq 编写了一个单元测试,为此我遵循了这个 Article,但我收到了这个错误:
非虚拟(在 VB 中可覆盖)成员的设置无效:m => m.Blogs
这是我尝试过的:
[Fact]
public void CreateBlog()
{
var mockDbSet = new Mock<DbSet<Blog>>();
var mockContext = new Mock<Context>();
mockContext.Setup(m => m.Blogs).Returns(mockDbSet.Object); //In this line i got error
var service = new BlogController(mockContext.Object);
service.AddBlog("ADO.NET Blog", "adtn.com");
mockDbSet.Verify(m => m.Add(It.IsAny<Blog>()), Times.Once());
mockContext.Verify(m => m.SaveChanges(), Times.Once());
}
这些是我的模型类:
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public virtual IList<Post> Posts { get; set; }
}
和:
public class Post
{
public int PostId { get; set; }
public string Title { get; set; }
public string Content { get; set; }
public DateTime RegisterDate { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
这是我的控制器:
public class BlogController : Controller
{
private readonly Context _context;
public BlogController(Context ctx)
{
_context = ctx;
}
[HttpPost]
public Blog AddBlog(string name, string url)
{
var blog = new Blog() { Name = name, Url = url };
_context.Blogs.Add(blog);
_context.SaveChanges();
return blog;
}
}
更新:我在上下文中创建了虚拟数据库,但它给出了另一个错误:
无法实例化类的代理:EntitFrameworkCore.Models.Context
有什么问题?
【问题讨论】:
-
错误信息说 ;)
-
我按文章说的做,所以文章出错了?
-
上下文中的博客属性需要是虚拟的
-
你也可以抽象上下文。因为模拟实际上是在创建一个仍在尝试连接到数据库的上下文实例
-
Mock 无法实例化它,因为 DbContext 没有无参数构造函数。在下面查看我的答案并考虑使用 InMemoryDb 或使用 DbContextOptionsBuilder 自己构建它,但是你不能模拟它并且必须使用在单元测试中不行的真实数据库
标签: c# unit-testing asp.net-core moq