gpt4 book ai didi

asp.net-web-api - 如何对EF Core迁移执行集成测试

转载 作者:行者123 更新时间:2023-12-05 00:46:06 25 4
gpt4 key购买 nike

我对此主题进行了广泛搜索,结果发现零结果完全符合我的意愿。
从高层次来看,这是我想要做的:

安排:在测试方法中,调用适当的服务以播种数据库。
行动:运行迁移以更新数据库架构。
断言:数据完整性,即可以根据更新的实体结构访问种子数据。

这有什么意义?
好在上面的断言中有很多描述;数据的完整性。此项目中的迁移是使用Database.Migrate()在应用启动时运行的。我想确保现有数据不会丢失/损坏。
我遇到的所有集成测试示例在测试设置中都会运行Database.Migrate(),然后进行种子设定,然后声明。但是,这仅在测试具有最新架构(已应用所有迁移)的数据访问层时才有用。它对于测试特定迁移对已存在数据的影响没有用。
题:
其他人如何解决跨迁移测试数据完整性的问题?我正在寻找一种可以与CI管道配合使用的设置。

最佳答案

请查看我的其他答案,因为它比以下方法更新且更简单。

我能想到的一种方法如下:
(请注意,我还没有测试过这个,这只是理论上的问题,所以请随时评论我可能出了什么问题。我自己在结尾处做了笔记,以解决我看到的问题;笔记对应于项目标有*或^)

假设您已经有迁移IM,M1,M2,...,Mn,其中IM是初始迁移,而迁移Mn是最后一次成功测试的迁移。现在,假设您要测试新的迁移Mn + 1,这是(除其他事项外)将User实体更新为不再具有单独的FirstNameLastName属性,而是具有单个< cc>属性。我们给它起一个名字Name

在继续您的测试方法之前,您必须在应用迁移Mn + 1之前完全捕获被测系统(SUT)的状态。因此,请执行以下操作:


如果尚不存在,请为迁移创建一个新的测试项目。
从迁移测试项目中删除所有现有内容^(该内容在以下步骤中进行描述)。
将模型中与Mn对应的所有实体的副本放入迁移测试项目中,需要对其进行修改以生成Mn + 1。编辑其名称以MergeFistAndLastNames为后缀(例如)。因此,由于实体Before_MergeFistAndLastNames需要更新,因此将其副本放入测试项目中并将其命名为User
对需要更新以生成Mn + 1的任何上下文*执行相同的操作。因此,假设(假设)User_Before_MergeFirstAndLastNames需要更新,请在测试项目中对其进行复制,然后将其命名为MembershipContext
最后,对为了播种测试数据库而需要调用的所有服务执行相同的操作(如果使用存储库模式,通常将调用存储库实现来修改数据库并对您的数据库进行更改实体可能会触发您的存储库实施的更改)。



现在为您的测试方法^^,您将:


安排:使用MembershipContext_Before_MergeFirstAndLastNames应用所有直到Mn的迁移,包括Mn。然后调用所需的服务来播种测试数据库**。
行动:再次使用IMigrator.Migrate,应用迁移Mn + 1。
断言:数据完整性***。



笔记:
*:如果将上下文复制到测试项目,则其中的任何与更新的实体相对应的IMigrator.Migrate属性都需要手动编辑以使用复制的实体。例如,在上面的示例中,如果DbSet具有属性MembershipContext_Before_MergeFirstAndLastNames,则必须将其更改为DbSet<User> User {get; set;}
**:您可能需要拨打多个服务。如果您到处都在使用IoC,则注入复制的服务应该相对容易。
***:数据完整性声明实际上取决于您正在测试的特定迁移及其潜在影响。对于上面给出的示例,可能值得检查的是,使用(旧的)单独的名字和姓氏作为种子的用户仍然可以通过更新后的DbSet<User_Before_MergeFirstAndLastNames> User {get; set;}检索,该更新后的UserService应该返回UserName等于姓和名的串联。

^:在测试新迁移时,需要清除迁移测试项目的所有内容。
非正式证明:让我们假设这不是必需的。使用上面的示例,该项目将包含一个测试方法,该方法将引用与迁移Mn + 1相对应的User实体。现在,假设对User进行了更新,这导致了较新的迁移Mn + 2。如果现有的测试方法以不再适用的方式引用User,则可能无法再编译。 ∎
上面的技术将在CI设置中很好地工作,在CI设置中,所有先前的迁移在合并到生产中之前都已经过测试。在这样的设置中,只有对测试最新的迁移感兴趣才有意义。
^^:对于每种测试Up迁移影响的测试方法,都需要一种反向测试方法来测试相应的Down迁移的影响。

关于asp.net-web-api - 如何对EF Core迁移执行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55086435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com