让我们说在我的用户模型中我有一个ChangePassword方法。给定已初始化的用户模型,它将新密码作为参数,并使数据库工作以实现神奇。其前端是一个Web表单,用户可以在其中输入当前密码和所需的新密码。然后控制器检查用户的当前密码是否正确。如果是这样,它将调用用户模型的ChangePassword方法。如果不是,则向用户显示错误。
据我所知,您应该对可能的最小代码进行单元测试,但在这种情况下,完全忽略检查以确保用户输入正确的当前密码。那我该怎么办?
我应该:
A)仅从控制器进行单元测试,有效地测试模型功能?
OR
B)创建2个不同的测试;一个用于控制器,一个用于模型?
答案 0 :(得分:4)
如有疑问,请同时测试。如果您只测试控制器并且测试失败,则您不知道问题是在控制器还是模型中。如果您同时测试两者,那么通过查看模型的测试结果就可以知道问题所在 - 如果它通过,控制器就会出错,如果失败,那么模型就会出错。
答案 1 :(得分:2)
A)
B)
测试两个层都很好。它会让以后更容易找到问题。
答案 2 :(得分:1)
这里应该有多个测试:
不要忘记,测试还可以在某种意义上帮助充当代码的文档,以便清楚地了解代码的每个部分。
答案 3 :(得分:1)
您可能需要考虑其他选项:Mock objects。使用这些,您可以在没有模型的情况下测试控制器,这可以加快测试执行速度并提高测试稳健性(如果模型失败,您知道控制器仍然有效)。现在您有两个正确的单元测试(每个测试只测试一个代码),如果需要,您仍然可以添加集成测试。
答案 4 :(得分:0)
A)在我看来不是单元测试,因为它使用多个类(或层)。所以你应该只对模型进行单元测试。
答案 5 :(得分:0)
单元测试意味着单独测试每个单元,因此在这种情况下,您需要构建两个单元测试,一个用于前端,一个用于后端。
要测试两者的组合需要进行集成测试,至少ITSQB会这样称呼它。
如果您编写面向对象的代码,通常会为每个类构建单元测试,因为这是可测试的最小的独立单元。