c# - 测试数据库调用 C#

标签 c# database entity-framework testing

首先,我们来谈谈这里的术语。我搜索的所有内容都说,“单元测试不接触数据库!”我不想进行单元测试。我想要一个测试,当我将数据发送到数据库时,我知道它正确地保存了它(并测试其他 crud 操作)。我有一个基本上接受 DTO 的存储库层,然后将该 DTO 映射到 Entity Framework 模型,然后将该模型保存到数据库。

我需要能够确保将 DTO 发送到这些方法实际上是在保存到数据库中。

存储库中的示例方法签名是:

public bool Save(SomeObjectDTO someObject)

我只需要测试此方法调用是否返回 true。

设置测试的最佳方式是什么?我调用的方法是保存到数据库的方法?

另外,是否有一个标准的方法来建立一个空白测试数据库?如果当我点击“运行测试”时它会构建一个空数据库,用必要的初始数据填充它,然后执行所有 CRUD 操作(我所有的存储库调用)以查看它们都像它们一样保存,那就太好了应该是。

如果这个问题已经得到回答,我深表歉意,但我搜索过的所有内容要么有人说你不应该测试数据库调用,要么有人谈论模拟,这在这里并不是很有用。

我只想要一个示例和/或关于如何设置这些类型的测试的标准做法。

最佳答案

您要查找的内容称为集成测试,它与编写单元测试一样重要。您的底层数据提供者暴露出许多潜在的错误,这些错误不一定会发现模拟您的存储库(无效的外键、标记为非空的内容的空数据等)。

我认为针对与生产系统相同的数据库提供程序进行测试也很重要,否则可能会遗漏特定于实现的行为。我将 Azure SQL 用于项目,而不是创建内存中的 SQL CE 实例,我在 Azure 上有一个单独的数据库,仅用于我的集成测试。

如果您使用 XUnit(并且我确信它存在于其他测试框架中),则有一个方便的属性 [AutoRollback] 会在每次测试运行后自动回滚您的事务。

[Fact]
[AutoRollback]
public void AddProductTest_AddsProductAndRetrievesItFromTheDatabase()
{
    // connect to your test db
    YourDbContext dbContext = new YourDbContext("TestConnectionString")

    dbContext.Products.Add(new Product(...));

    // get the recently added product (or whatever your query is)
    var result = dbContext.Single();

    // assert everything saved correctly
    Assert.Equals(...);
}

测试完成后,您的数据库将再次处于空白状态(或运行测试之前的任何状态)。

关于c# - 测试数据库调用 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25977388/

相关文章:

c# - 如何在后台任务中使用具有依赖性的作用域服务

ruby-on-rails - Rails 无法登录到 postgresql - PG::Error - 密码 - 正确信息

database - 如何找出 Hive 数据库的总大小

mysql - 使用 Bash 脚本进行数据库归档

c# - Entity Framework 错误 "Entity type is not mapped."

c# - 带 Linq 的 Entity Framework 、内部连接、分组依据、排序依据

c# - 未处理的异常 : Two Hubs must not share the same name

c# - Visual Studio 成功编译 MVC 4 项目但 Controller 显示一些错误

c# - System.Data.DataRowCollection' 不包含 'Cast' 的定义

c# - 无法将类型 'System.Data.EntityState' 隐式转换为 'System.Data.Entity.EntityState' 。存在显式转换(您是否缺少转换?)