c# - 我将如何进行单元测试?

标签 c# unit-testing mocking rhino-mocks stubbing

我需要开发一个相当简单的算法,但对如何最好地为其编写测试感到困惑。

一般说明:用户需要能够删除计划。计划有与之关联的任务,这些任务也需要删除(只要它们尚未完成)。

作为算法行为的伪代码:

   PlanController.DeletePlan(plan)
     =>
     PlanDbRepository.DeletePlan()
      ForEach Task t in plan.Tasks
          If t.Status = Status.Open Then
            TaskDbRepository.DeleteTask(t)
          End If
      End ForEach

现在据我了解,单元测试不应该接触数据库或通常需要访问任何外部系统,所以我猜我在这里有两个选择:

1) 模拟存储库调用,并检查它们是否已作为断言被调用适当次数

2) 为两个存储库类创建 stub ,手动设置它们的删除标志,然后验证适当的对象是否已标记为删除。

在这两种方法中,最大的问题是:我到底在测试什么?这些测试给我带来的额外值(value)是什么?

如果您对此有任何见解,我们将不胜感激。这在技术上没有链接到任何特定的单元测试框架,尽管我们可以使用 RhinoMocks。但我更喜欢一般性的解释,这样我就可以正确地解决这个问题。

最佳答案

您应该模拟存储库,然后在包含打开和关闭任务的单元测试中构建一个虚拟计划。然后调用传递此计划的实际方法,最后验证是否使用正确的参数调用了 DeleteTask 方法(只有 status = Open 的任务)。这样您就可以确保您的方法只删除了与该计划关联的未完成任务。也不要忘记(可能在单独的单元测试中)通过断言已对您传递的对象调用 DeletePlan 方法来验证计划本身已被删除。

关于c# - 我将如何进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4386567/

相关文章:

ruby-on-rails - 如何测试是否在使用 RSpec 从 Rails 中的数据库中提取的特定对象上调用了方法?

c# - 使用 ControlTemplate 覆盖 XAML WPF 中的按钮不显示内容

angularjs - 如何在 AngularJS 测试之间重置服务

c# - 无法在 NUnit 中加载程序集

安卓单元测试: how to clear SharedPreferences

java - 模拟一个列表并尝试迭代它

c# - 尝试在 Windows 窗体中使用 SQL 存储过程

c# - Winforms 应用程序停止绘图但仍对事件有反应

c# - 使用 .NET 4.5 (System.IdentityModel)/WIF 解密 SAML 2 断言

mocking - Typemock 与最小起订量