如何在.NET核心中管理ApplicationDbContext [英] How do I Moq the ApplicationDbContext in .NET Core

查看:14
本文介绍了如何在.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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆