我该如何进行单元测试呢?

Sam*_*Sam 5 c# unit-testing rhino-mocks mocking 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
Run Code Online (Sandbox Code Playgroud)

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

1)模拟Repository调用,并检查它们是否被称为Asserts的适当次数

2)为两个存储库类创建存根,手动设置其删除标志,然后验证是否已将相应的对象标记为删除.

在这两种方法中,最大的问题是:我到底在测试什么?这些测试给我的EXTRA值是多少?

对此的任何见解都将受到高度赞赏.虽然我们使用了RhinoMocks,但这在技术上并没有与任何特定的单元测试框架相关联.但是我更喜欢一般性的解释,这样我才能正确地解决这个问题.

Dar*_*rov 4

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