Ruby on rails 我真的应该测试控制器吗?

Ruby on rails 我真的应该测试控制器吗?,ruby-on-rails,ruby,rspec,bdd,Ruby On Rails,Ruby,Rspec,Bdd,我正在努力获得最佳的codecoverage/开发时间结果 目前,我使用rspec+shoulda来测试我的模型,并使用rspec+capybara来编写验收测试 我试着为一个简单的crud编写一个控制器测试,但是它花费了太长的时间,最后我得到了一个令人困惑的测试(可能是我的错) 用rspec测试控制器的最佳实践是什么 以下是关于我的测试和控制器的要点(一个测试尚未通过): 您应该进行测试吗?对 有一些宝石可以让测试控制器更快 一定要测试控制器。一些痛苦的经验法则: 模拟模型对象 控制器操作

我正在努力获得最佳的codecoverage/开发时间结果

目前,我使用rspec+shoulda来测试我的模型,并使用rspec+capybara来编写验收测试

我试着为一个简单的crud编写一个控制器测试,但是它花费了太长的时间,最后我得到了一个令人困惑的测试(可能是我的错)

用rspec测试控制器的最佳实践是什么

以下是关于我的测试和控制器的要点(一个测试尚未通过):

您应该进行测试吗?对

有一些宝石可以让测试控制器更快


一定要测试控制器。一些痛苦的经验法则:

  • 模拟模型对象
  • 控制器操作使用的存根模型对象方法
  • 牺牲许多鸡

    • 也许不是。

      确保可以为控制器编写测试。这可能有助于编写更好的控制器。但是,如果控制器中的逻辑很简单(应该如此),那么控制器测试就不是胜利者

      就我个人而言,我更喜欢经过良好测试的模型和一整套完整的集成(验收)测试,而不是任何时候的控制器测试


      也就是说,如果您在为控制器编写测试时遇到困难,那么一定要测试它们。至少在你掌握窍门之前。然后决定是否继续。每种测试都是一样的:尝试直到你理解它,以后再做决定。

      我喜欢对每个控制器方法进行测试,至少是为了消除可能导致页面崩溃的愚蠢语法错误。

      许多人似乎正在转向使用Cucumber进行集成测试,而不是编写控制器和路由测试。

      我的看法是验收测试(即Cucumber/Capybara),测试用户通常在应用程序上执行的交互。这通常包括以下内容:用户是否可以使用有效数据创建特定资源,然后在输入无效数据时是否会看到错误。控制器测试更多的是针对用户通常不能做的事情,或者极端的边缘情况,这些情况对Cucumber来说太麻烦了

      通常,当人们编写控制器测试时,他们实际上是在测试相同的东西。在控制器测试中测试控制器方法的唯一原因是针对边缘情况

      边缘情况下,如用户在显示页面输入无效ID,则应显示404页面。这是一种非常简单的控制器测试,我建议您这样做。你要确保当他们点击该动作时,他们收到404响应,砰,简单

      确保您的
      new
      操作成功响应并且没有语法错误?请这就是你的黄瓜特征告诉你的。如果动作突然出现“呜呜”的情况,您的功能将中断,然后您将修复它


      另一种思考方式是,您是否希望测试特定操作以某种方式响应(即控制器测试),或者您是否更关心用户可以进入该
      新的
      操作并实际完成创建该资源的整个过程(即验收测试)?编写控制器测试允许应用程序对您撒谎。一些原因:

      • 控制器测试不会在其运行的环境中执行。i、 e.它们不在机架中间件堆栈的末尾,因此在使用Desive(作为一个简单的示例)时,用户之类的东西不可用。随着Rails越来越多地转向基于机架的设置,使用的机架中间件也越来越多,您的环境也越来越偏离“单元”行为
      • 您不是在测试应用程序的行为,而是在测试实现。通过模仿和存根,您正在以规范形式实现实现。一个简单的方法来判断你是否正在这样做;如果您没有更改url响应的预期行为,但确实更改了控制器的实现(甚至可能映射到不同的控制器),那么您的测试是否会中断?如果他们这样做了,那么您是在测试实现,而不是行为。你也在给自己设置谎言。当您进行存根和模拟时,无法保证您设置的模拟或存根会按照您认为的方式进行操作,甚至无法保证重构发生后它们假装存在的方法
      • 通过应用程序的“公共”api调用控制器方法是不可能的。到达控制器的唯一方法是通过堆栈和路由。如果您无法通过url将其从请求中断开,那么它真的断开了吗
      我使用测试来保证我的应用程序在部署时不会崩溃。控制器测试并没有增加我对我的应用程序确实可以正常运行的信心,实际上它们的存在降低了我的信心

      另一个例子是,在测试应用程序的“行为”时,您是否关心呈现了特定的文件模板,或者引发了特定的异常,或者应用程序的行为是使用特定的状态代码向客户端返回某些内容


      测试控制器(或视图)会增加您强加给自己的测试负担,这意味着重构的成本高于需要,因为可能会破坏测试。

      Hi!如果要使用换行符创建列表,则需要在每行的末尾有2个空格。在我看来,在每一行前面加上“
      *”
      ”更容易阅读——我编辑了你的文章,这样你就可以看一看了。如果您不喜欢,请随意回滚:-)控制器中无需测试,逻辑应在模型、服务等中。我接受rspec/capybara和unit,仅适用于模型。我喜欢接受的地方在于,您不需要测试实现。您测试了功能,实现了