如何使用实体框架测试视图?

Posted

技术标签:

【中文标题】如何使用实体框架测试视图?【英文标题】:How to test views using Entity Framework? 【发布时间】:2015-02-13 08:38:55 【问题描述】:

我们使用不属于我们的数据库来管理。我们在其上定义了一些视图,以便我们的代码(带有实体框架的 C#)可以简单地映射到这些视图。这些视图将在稍后提供给数据库所有者。他们将实现它们,以便我们可以使用它们。

在测试期间,我们模拟该数据库。我们在数据库的备份上使用实体框架工具来生成它的 DbContext。我们每次运行测试时都会创建它。这甚至是要走的路吗?

在测试期间,我们想在一些表中插入数据,并从相关视图中读取结果。我们这样做是为了测试视图以及将对其进行操作的 C# 代码(这些视图中存在不平凡的逻辑)。

您对此有何看法?我们不应该每次都重新创建模拟数据库,而是使用已定义视图的静态数据库吗?我们是否应该在 C# 中定义视图以便在数据库上创建它们?我们的方法完全错误吗?其他人如何解决类似问题?

【问题讨论】:

我很想知道您是否找到了一种方法来做到这一点,因为我目前处于类似情况,并且我正在努力了解如何最好地根据视图测试实体。我们可以测试将数据插入到基础表中,但我不确定最佳实践是什么,然后测试我们是否可以正确检索该数据。 【参考方案1】:

“在测试期间,我们模拟了那个数据库......”

在 EF 版本 6 或更高版本中,您还可以模拟 DBContext。

“在测试期间我们想插入...”

你有继承的DBContext的源码吗?我建议像处理表格一样处理视图。为它创建一个类(实体),然后在您的 applicationDBContext 中像普通表一样映射视图。

 public DbSet<ImAView> ImAViews  get; set; 

通过数据库迁移,您可以使用普通的 T-SQL 脚本修改您的视图。

“您对此有何看法?不应该”

如果您正在测试应用程序(也是版本 6 中的数据访问层),您可以模拟所有内容。不要使用数据库创建,这会使您的测试非常缓慢,并且在某些情况下测试将依赖于其他测试。

如果您想测试数据库本身或迁移或一些批量操作,那么您必须创建一个数据库(您可以在没有 C# 的 SQL Server 中执行所有操作)并为其提供数据。

【讨论】:

感谢您的回复。我们已经使用 DbContext 模拟了数据库。我们已经将视图定义为表格。所以我们有一个 DbContext 类,每个表和视图都有 DbSet。我们想要实现的是那些视图(我们将其用作表格)实际上“工作”。如果我有一个基于表 A、B 和 C 的视图 X;我想将数据插入表 A、B 和 C 并继续使用视图 X。 您的方法是正确的,但是视图维护的问题是高度复杂的考虑迁移考虑实体修改等。 我不明白我为什么需要迁移。我们将要测试的数据库不是我们的数据库。我们甚至无法修改它。我们有一个用于生成 DbContext 的本地只读备份。正是这个 DbContext,我们将为每个测试生成一个数据库,以便我们可以填充它并对其进行测试。我们也想在这个模拟的 DbContext 数据库上测试这些视图。这些视图不会被部署到生产环境中。在我们测试之后,这些视图必须由数据库所有者手动创建。 所以您想在关系数据库中进行结构测试。要评估整个故事,我需要查看代码!视图经常实现有趣的业务逻辑。需要注意的事项包括:过滤/选择逻辑是否正常工作?你得到正确的行数吗?您是否返回正确的列?列和行的顺序是否正确? Bassam,我很欣赏你的 cmets,但它们根本不相关,因此不是很有帮助。首先,我不能只向您展示我的几千兆字节或其中的大块的存储库,并期望您立即理解它。此外,它是公司代码,所以我不会公然将其上传到互联网上。下一个;我的观点是有效的,这也不是问题。我唯一的问题是“如何在定义视图时模拟 EF 上下文,以便它们在测试中可用。”我现在有一个不太优雅的解决方案,因此我的问题......

以上是关于如何使用实体框架测试视图?的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架中使用视图

我应该如何设置我的集成测试以使用带有实体框架的测试数据库?

视图和实体框架

实体框架中的视图?

实体框架迁移 - 如何创建单元测试以确保迁移模型是最新的?

Asp.net 如何使用实体框架删除一对多的对象