• EntityFrameworkCore教程:单元测试


    一、引言

    我们先来讲解如何对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的那条数据,所以测试报错了。

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

  • 相关阅读:
    顺序程序设计03 零基础入门学习C语言09
    数据类型,运算符和表达式05 零基础入门学习C语言06
    顺序程序设计01 零基础入门学习C语言07
    顺序程序设计01 零基础入门学习C语言07
    顺序程序设计02 零基础入门学习C语言08
    数据类型,运算符和表达式05 零基础入门学习C语言06
    分支程序设计01 零基础入门学习C语言10
    分支程序设计01 零基础入门学习C语言10
    VC++ 实现线程注入
    ISV 客户博客系列:Minitab通过Windows Azure推出云端Qeystone
  • 原文地址:https://www.cnblogs.com/dotnet261010/p/12350558.html
Copyright © 2020-2023  润新知