与数据库交互而不在数据库中创建数据的单元测试代码

Posted

技术标签:

【中文标题】与数据库交互而不在数据库中创建数据的单元测试代码【英文标题】:Unit test code that interacts with database without creating data in database 【发布时间】:2014-06-10 20:49:46 【问题描述】:

我想在 Visual Studio 中使用单元测试来测试我的 C# 代码。 该代码与 mysql 数据库交互。

我要测试的示例 用户打开我的应用程序并将通过 Web 服务保存在数据库中。现在我想知道在新用户到来之前表Users 是否还有一行。但是如果我在 webservice 中测试该方法,它将在数据库中创建一条记录,测试数据将在数据库中。而且我不希望我的数据库中有测试数据。

这个问题有解决办法吗?

【问题讨论】:

如果它与 Web 服务和数据库交互,那么它不是单元测试。单元测试单独测试代码 使用内存数据库进行此类集成测试 你应该用一个假人替换你的数据库并断言它,因为约翰写了一个 UnitTest 根本不应该与数据库交互。 【参考方案1】:

我认为您正在寻找的是mocking。这允许您模拟您的数据访问代码以测试您的业务逻辑。

有很多好的框架,包括moq 和rhino mocks。

如果您想实际填充您的数据库以测试您的数据访问层,那么您正在寻找更多的集成测试。我已经写了一个相当详尽的答案,涵盖了我的数据库集成测试方法here。

【讨论】:

【参考方案2】:

您正在寻找的是一个 Mock。例如 C# 的起订量。

将您的数据库逻辑包装在一个界面中,并在您的单元测试中模拟它。这样您就可以与模拟的数据库逻辑进行交互,而无需真正执行它。

【讨论】:

【参考方案3】:

模拟是一种很好的方式。

如果您想要更多类似集成测试的方法(这在您想要测试实际的数据库交互时会很有帮助),您可以使用本地运行的 MySql 服务器实例。

我创建了一个项目,让您无需设置即可在实时 MySql 服务器上运行测试。

您可以下载 Nuget 包 (Mysql.Server) 或在此处查看:https://github.com/stumpdk/MySql.Server

【讨论】:

【参考方案4】:

您还可以查找 Microsoft fakes 框架。 https://docs.microsoft.com/en-us/visualstudio/test/isolating-code-under-test-with-microsoft-fakes?view=vs-2017

【讨论】:

以上是关于与数据库交互而不在数据库中创建数据的单元测试代码的主要内容,如果未能解决你的问题,请参考以下文章

实体框架 6 不在 SQLite 数据库中创建表

rpart 不在 R 中创建决策树,SVM 有效

PDF多页不在android中创建[关闭]

为啥我的 Django 工厂函数在本地数据库中创建模型,而不是测试数据库?

数据库驱动的 CodeIgniter Web 应用程序中的单元测试

db.create_all() 在磁盘上但不在内存中创建模式