欢迎来到代码驿站!

.NET代码

当前位置:首页 > 软件编程 > .NET代码

对Entity Framework Core进行单元测试

时间:2022-11-25 10:41:13|栏目:.NET代码|点击:

一、引言

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

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

上一篇:C#泛型集合类System.Collections.Generic

栏    目:.NET代码

下一篇:没有了

本文标题:对Entity Framework Core进行单元测试

本文地址:http://www.codeinn.net/misctech/219874.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有