【问题标题】:How to implement database seeding for testing with Entity Framework如何实现数据库播种以使用 Entity Framework 进行测试
【发布时间】:2020-06-23 14:41:18
【问题描述】:

我需要对某些应用程序实施测试,但我不确定以易于维护的方式实施测试的最佳和最简洁的方法是什么。场景如下:

我有多个应用程序,包括一个 MVC .Net Framework 项目和多个 Azure 功能,其中一个使用 .Net Framework 实现,导致一些依赖项需要它,但其中大部分在 .Net Core 中。 所有这些应用程序都使用 EntityFramework 来操作 MSSQL 数据库,我需要找到一种方法,在测试前使用默认配置数据和一些预制记录来为内存或临时数据库播种。

我想到的一个解决方案是创建一个类库项目,为数据库提供种子,每个测试项目都可以引用该项目,当需要向种子添加内容时,您只需编辑该项目即可。但我不知道这是否是最好的解决方案,因为我有 .Net Framework 和 .Net Core 应用程序,所以可能每个 EntityFramework 版本的每个方法至少需要 2 个实现,我不确定是否这样,我的播种器类需要知道 DB 模式,或者我可以基于 DBContext 类实现代码。

这是一个好的解决方案吗?有没有其他标准的方式来实现这样的东西?

【问题讨论】:

    标签: c# testing .net-core entity-framework-core automated-tests


    【解决方案1】:

    你的问题有很多假设:我理解它的方式是,无论如何你都会将相关的 DbContext 传递给你的播种器类。假设通过“测试”,您的意思是将适当的测试数据放入 SQL 数据库,然后您的种子类所在的 .NET Core 类库就足够了;它只需要了解 DbContext。

    示例播种器类:

    using System.Linq;
    using System.Threading.Tasks;
    
    using BusinessLogic.Entities;  //this is where your business/EF entities live
    
    namespace DataAccessLayer.Data.Services
    {
        public class SeederService
        {
            #region FIELDS
            private readonly TestContext _passedInDbContext;
    
            #endregion
    
            #region CONSTRUCTOR
            public SeederService(TestContext passedInDbContext)
            {
                _passedInDbContext = passedInDbContext;
            }
    
            #endregion
    
            #region METHODS PUBLIC
            public async Task<bool> SeedDatabaseAsync()
            {
                if (!_passedInDbContext.Currencies.Any()) //see if any entries already exist in the Currency SQL table
                {
                    //test data
                    _passedInDbContext.Currencies.AddRange
                        (
                            new Currency("GBP", "GBP United Kingdom Pounds", "£", 1.000m),
                            new Currency("USD", "USD United States Dollar", "$", 1.200m),
                            new Currency("EUR", "EUR Euro", "€", 1.100m)
                        );
                }
    
                await _passedInDbContext.SaveChangesAsync();
    
                return true;
            }
            #endregion
        }
    }
    

    希望这会有所帮助。当然,您可能希望设置一个测试 SQL 数据库并使用适当的连接字符串迁移/更新/播种此数据库。

    【讨论】:

    • 是的,这基本上就是我的想法。但是如果我写了一个.Net Core Class Lib,我可以在.Net Framework 制作的项目中引用它吗?关于将上下文传递给库,如果我有来自 EntityFramework 的上下文,它将与 Class Lib 中的 EntityFrameworkCore 实现一起使用吗?
    • 所有项目/解决方案是否都引用相同的 SQL 数据库和相同/相似的连接字符串?
    • 是的,完全相同的数据库,相同的连接字符串,有些项目只有对数据库中某些表的 EF 引用,有些对所有表都有,但它是同一个 DB。
    • 理想情况下,您应该拥有一个 DataAccessLayer 之类的东西,它包含您所有项目的上下文,可以引用。不能从 .NET Framework 项目引用 .NET Core 类库。因此,在 .NET Framework 4.8(例如)中创建一个类库,它包含您的上下文以及您可以放置​​播种方法的位置,并且您的所有其他项目都可以引用它。让我看看如何混合不同的 EF 版本。
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2018-01-15
    • 2012-04-12
    • 2022-12-13
    相关资源
    最近更新 更多