我需要开发一个相当简单的算法,但对如何最好地为其编写测试感到困惑。
一般说明:用户需要能够删除计划。计划有与之关联的任务,这些任务也需要删除(只要它们尚未完成)。
作为算法行为的伪代码:
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/