c# - 如何使用单元测试测试以下场景?

标签 c# unit-testing

我会对以下内容进行单元测试还是进行其他类型的测试:

我想更新数据库中的值,更新值后,我想确保数据库更新了正确的值,但这意味着我必须查询数据库并确定是否存在正确的值,以及我认为在单元测试中,接触数据库是不行的。

我想对如下方法进行单元测试(db 和 Update 由它们组成):

public void UpdateValue(int value)
{
   db.Update(value);
}

最佳答案

您可以简单地测试您的方法是否成功调用了数据库。模拟倾向于关注这一点,即您期望发生的调用确实发生了。

它将涉及用测试版本替换 db,这样您对 UpdateValue 的测试将断言它期望 db.Update(value)以相同的值调用。

应该测试存储过程或 SQL(归根结底,它仍然会像 C# 代码一样出现错误),但可能会独立于您的代码单元测试来完成。我们有一个单独的测试项目来测试存储过程逻辑。由于这涉及物理数据库,因此它保持独立和最小化——但我们仍然认为它是必不可少的。我们已经到了测试几乎所有数据库脚本的阶段,但是开始时您通常可以不测试基本的 CRUD 代码。任何具有条件语句的 SQL 都会接受测试。

如果您想进行端到端测试以查看是否可以使用您的代码保存到数据库并再次取回值,这不是/strong> 定义为单元测试。作为@lazyberezovsky states ,这是一个整合测试。单元测试旨在移除代码单元周围的所有依赖项,以便单独测试该单元。

也就是说,(在我看来)也必须进行集成测试。我们让它们针对用例,以便我们测试用户已签署的用例操作。这会一次性处理大量代码,但有一个明显的缺点,即与共享状态/副作用代码作斗争。您会发现对于集成测试,大部分测试是准备而不是断言代码。您还会发现它们无法识别失败的特定代码,因此诊断集成测试失败变得更加困难。

我们通过集成测试取得了中间立场。我们的数据库通过 DAL 接口(interface)提供,我们简单地 stub 这个接口(interface)(不同于模拟)以提供内存中测试数据而不是物理数据库。这样做的一个缺点是我们错过了对数据库的集成测试。

关于c# - 如何使用单元测试测试以下场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10916174/

相关文章:

c# - 使用智能在 c# 中取缔字符串

c# - 如何设置服务定位器来测试 MVVM 中的 View 模型

angular - 对话框测试 - 当我模拟 this.store$.pipe( select(...) ...).subscribe(..) 时,Jasmine 返回 this.store$.pipe 不是函数

python - 模拟 requests.post 和 requests.json 解码器 python

unit-testing - 函数组合的单元测试准确性

c# - 查找 URL 方案

C# 流程 - 数据流、XML 和数据网格

c# - Windows Phone Longlistselector ItemsSource Performance

c# - 忽略引号内的分隔符 CsvHelper

Android Studio,Junit4加入classpath后仍无法解析Junit