首先,我们来谈谈这里的术语。我搜索的所有内容都说,“单元测试不接触数据库!”我不想进行单元测试。我想要一个测试,当我将数据发送到数据库时,我知道它正确地保存了它(并测试其他 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/