如何在.NET核心中管理ApplicationDbContext [英] How do I Moq the ApplicationDbContext in .NET Core
本文介绍了如何在.NET核心中管理ApplicationDbContext的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我是第一次尝试.NET Core,看看如何在单元测试中使用Moq。在创建控制器时,ApplicationDbContext是构造函数的参数,如下所示:
public class MoviesController : Controller
{
private readonly ApplicationDbContext _context;
public MoviesController(ApplicationDbContext context)
{
_context = context;
}
以下是我在测试控制器时开始的单元测试:
[TestClass]
public class MvcMoviesControllerTests
{
[TestMethod]
public async Task MoviesControllerIndex()
{
var mockContext = new Mock<ApplicationDbContext>();
var controller = new MoviesController(mockContext.Object);
// Act
var result = await controller.Index();
// Assert
Assert.IsInstanceOfType(result, typeof(ViewResult));
}
但随后我意识到ApplicationDbContext是一个具体的类,并且它没有无参数的构造函数,因此测试将无法工作。出现错误:找不到无参数构造函数。
也许这是一个更针对Moq的问题,而不是与.NET Core相关的问题,但我对Moq也是新手,所以我不确定如何继续。下面是我创建项目时生成ApplicationDbContext代码的方式:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
// Customize the ASP.NET Identity model and override the defaults if needed.
// For example, you can rename the ASP.NET Identity table names and more.
// Add your customizations after calling base.OnModelCreating(builder);
}
public DbSet<Movie> Movie { get; set; }
}
我需要更改哪些内容才能使单元测试成功?
更新:
我从https://msdn.microsoft.com/en-us/magazine/mt703433.aspx发现,您可以将EF Core配置为使用内存中的数据库进行单元测试。所以我更改了我的单元测试,如下所示:
[TestMethod]
public async Task MoviesControllerIndex()
{
var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>();
optionsBuilder.UseInMemoryDatabase();
var _dbContext = new ApplicationDbContext(optionsBuilder.Options);
var controller = new MoviesController(_dbContext);
// Act
var result = await controller.Index();
// Assert
Assert.IsInstanceOfType(result, typeof(ViewResult));
}
此测试现在成功。但这是做这件事的正确方式吗?显然,我完全消除了用Moq嘲弄ApplicationDbContext!或者,是否有使用Moq解决此问题的其他解决方案。
推荐答案
模拟DbContext不起作用,因为需要太多提供程序才能使其起作用。一个更简单的解决方案是使用微软为此目的而实施的InMemory解决方案。请不要仅仅为了测试而创建回购(这仍然不会测试EF代码)。
这里是指向如何在.Net core中测试InMemory数据库的链接
https://docs.efproject.net/en/latest/miscellaneous/testing.html
这篇关于如何在.NET核心中管理ApplicationDbContext的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文