对Entity Framework Core进行单元测试

 更新时间:2022年03月24日 11:36:51   作者:.NET开发菜鸟  
这篇文章介绍了对Entity Framework Core进行单元测试的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、引言

我们先来讲解如何对EntityFrameworkCore进行单元测试,这里我们使用内存数据库进行测试。使用内存数据库需要安装Microsoft.EntityFrameworkCore.InMemory这个包。

二、创建测试项目

我们还是以上面文章中创建的项目为例,在解决方案中添加一个测试项目,这里选择使用xUnit作为测试项目:

创建完成后的项目结构如下图所示:

我们首先在EFCoreTest项目中安装Microsoft.EntityFrameworkCore和Microsoft.EntityFrameworkCore.InMemory这两个包,直接在NuGet里面安装即可,这里不在描述安装步骤。添加完成以后添加对实体的引用。

我们创建数据上下文,继承自DbContext:

/// <summary>
/// 数据上下文,继承自DbContext
/// </summary>
public class EFCoreDbContext:DbContext
{
    /// <summary>
    /// 通过DbContextOptions选项给父类构造传参
    /// </summary>
    /// <param name="options"></param>
    public EFCoreDbContext(DbContextOptions options):base(options)
    {

    }

    // DbSet属性
    public DbSet<Blog> Blogs { get; set; }
}

我们在创建一个方法,返回类型是DbContextOptions类型:

public static DbContextOptions<EFCoreDbContext> CreateDbContextOptions(string databaseName)
{
    var serviceProvider = new ServiceCollection().
        AddEntityFrameworkInMemoryDatabase()
        .BuildServiceProvider();

    var builder = new DbContextOptionsBuilder<EFCoreDbContext>();
    builder.UseInMemoryDatabase(databaseName)
        .UseInternalServiceProvider(serviceProvider);

    return builder.Options;
}

最后编写测试代码,整体代码如下:

using EFCore.Model;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using Xunit;

namespace EFCoreTest
{

/// <summary>
/// 数据上下文,继承自DbContext
/// </summary>
public class EFCoreDbContext:DbContext
{
    /// <summary>
    /// 通过DbContextOptions选项给父类构造传参
    /// </summary>
    /// <param name="options"></param>
    public EFCoreDbContext(DbContextOptions options):base(options)
    {

    }

    // DbSet属性
    public DbSet<Blog> Blogs { get; set; }
}


    public class UnitTest1
    {

        public static DbContextOptions<EFCoreDbContext> CreateDbContextOptions(string databaseName)
        {
            var serviceProvider = new ServiceCollection().
                AddEntityFrameworkInMemoryDatabase()
                .BuildServiceProvider();

            var builder = new DbContextOptionsBuilder<EFCoreDbContext>();
            builder.UseInMemoryDatabase(databaseName)
                .UseInternalServiceProvider(serviceProvider);

            return builder.Options;
        }

        /// <summary>
        /// 测试方法,这里使用异步
        /// </summary>
        [Fact]
        public async void Test1()
        {
           var options=  CreateDbContextOptions("batabase");
            var context = new EFCoreDbContext(options);
            // 添加数据
            context.Blogs.Add(new Blog() { Name = "ef core" });
            // 保存
            context.SaveChanges();
            // 查询数据
            var blog = await context.Blogs.FirstOrDefaultAsync(p => p.Id == 1);
            // 断言
            Assert.NotNull(blog);
        }
    }
}

在测试方法上面右键,选择“Live Unit Testing”,这个是实时的,我们可以在输出窗口里面看到实时的信息:

启动测试,在输出窗口查看测试结果:

可以看到测试代码前面都打勾了,表示测试通过。我们修改测试代码,改为查询id为2的数据:

因为我们只添加了一条数据,没有id为2的那条数据,所以测试报错了。

到此为止,我们就完成了一个简单的单元测试。

到此这篇关于对Entity Framework Core进行单元测试的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • SQL Server 2008 R2:error 26 开启远程连接详解

    SQL Server 2008 R2:error 26 开启远程连接详解

    本篇文章小编为大家介绍,SQL Server 2008 R2:error 26 开启远程连接详解。需要的朋友参考下
    2013-04-04
  • asp.net core项目授权流程详解

    asp.net core项目授权流程详解

    本文详细讲解了asp.net core项目的授权流程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Automation服务器不能创建对象的多种解决办法

    Automation服务器不能创建对象的多种解决办法

    这篇文章主要介绍了Automation服务器不能创建对象的多种解决办法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • .NET C#创建WebService服务简单实例

    .NET C#创建WebService服务简单实例

    这篇文章主要为大家详细介绍了.NET C# 创建WebService服务简单实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • ASP.NET WebAPI2复杂请求跨域设置的方法介绍

    ASP.NET WebAPI2复杂请求跨域设置的方法介绍

    这篇文章主要给大家介绍了关于ASP.NET WebAPI2复杂请求跨域设置的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用ASP.NET具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07
  • 使用asp.net的pageDataSource中时索引问题解决方法

    使用asp.net的pageDataSource中时索引问题解决方法

    当前页面在数据的除第一页的任何一个页面时,重新条件查询并且是新条件的总页数小于刚才查询得到的页码时,就会出现“索引 20 不是为负数,就是大于行数”的类似的错误
    2013-04-04
  • TreeView无刷新获取text及value实现代码

    TreeView无刷新获取text及value实现代码

    这篇文章介绍了TreeView无刷新获取text及value实现代码,有需要的朋友可以参考一下
    2013-10-10
  • 如何使用.NET Core 选项模式【Options】

    如何使用.NET Core 选项模式【Options】

    这篇文章主要介绍了如何使用.NET Core 选项模式,文中讲解非常详细,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • asp.net Gridview行绑定事件新体会

    asp.net Gridview行绑定事件新体会

    最近在做统计GridView中某一列的加总值,之前有在RowDataBound事件中中逐笔加总,经过测试才知道,这是不正确的,并不能得到所有资料的加总值。
    2009-11-11
  • C#各种集合操作的性能总结

    C#各种集合操作的性能总结

    本文主要记录的是C#各种集合操作的性能,下面的标记说明描述标记的时间,下面的表格对比各种集合各种操作的时间,需要了解的朋友可以参考下
    2012-12-12

最新评论