【问题标题】:When should I test Views separately in Cucumber & RSpec workflow?我什么时候应该在 Cucumber & RSpec 工作流程中单独测试视图?
【发布时间】:2010-12-16 16:51:21
【问题描述】:

在做了一段时间 Cucumber 和 RSpec BDD 之后,我意识到我的许多 Cucumber 功能只是更高级别的视图测试。

当我开始编写我的场景然后进入 RSpec 时,我从不编写视图规范,因为我可以只复制和粘贴场景的一部分,这将是丑陋的重复。

以这个场景为例

Scenario: New user comes to the site
  Given I am not signed in
  When I go to the home page
  Then I should see "Sign up free"

我知道这不是直接测试视图,但是编写单独的视图规范来检查相同的东西对我来说似乎是多余的。

我接近 Cucumber 是不是错了? 我应该在视图规范中具体测试什么?

我是否应该为每个视图编写它们,例如测试视图的操作,例如

def show
  @project = current_user.projects.first
end

还是我应该只测试更复杂的视图?

【问题讨论】:

    标签: ruby-on-rails ruby rspec cucumber bdd


    【解决方案1】:

    这是一种被广泛接受(在我看来是不正确的)Cucumber 哲学,即视图应该永远在 RSpec 中进行测试。争论的观点是,既然视图的行为可以在 Cucumber 中描述,RSpec 应该坚持它最了解的东西——模型和控制器。

    我认为 Cucumber 的“人类可读”方面使得视图规范的某些方面变得重要。例如,我发现视图规范在与前端开发人员并行工作时效果很好。如果 JavaScript 开发人员知道他想挂接到您页面上的选择器,那么您的视图提供该选择器很重要。

    例如:

    describe 'gremlins/show.html.haml' do
      context 'given it is after midnight' do
        it 'has a #gremlin_warning selector' do
          Time.stub!(:now).and_return(Time.parse '2010-12-16 00:01:00')
          rendered.should have_selector '#gremlin_warning'
        end
      end
    
      context 'it is before midnight' do
        it 'does not have a #gremlin_warning selector' do
          Time.stub!(:now).and_return(Time.parse '2010-12-16 23:59:00')
          rendered.should_not have_selector '#gremlin_warning'
        end
      end
    end
    

    请注意,规范不描述内容,它们故意简短,并且不描述交互行为。因为视图是应用程序中变化最大的部分,所以应谨慎使用视图规范。

    tl;dr:视图规范用于与其他开发人员交流合同,应谨慎使用(但仍然应该使用)。

    【讨论】:

    • 普遍共识是在 Rails 应用程序中进行三种测试:Cucumber 中的功能/验收测试以及 RSpec 中的模型和控制器测试(以及您的建议,即 RSpec 视图测试有时会很有用) ?
    • 我同意这种说法,是的。 Cucumber 处理经典的验收测试。 RSpec 处理经典的集成(控制器式)和单元(模型式)测试。
    • 不。这些应该在黄瓜故事中。由于范围不足,查看规范 100% 无用。
    • 哦,RSpec 控制器测试也是不必要的(因为它们没有告诉你 Cucumber 故事没有告诉你的任何东西)。如果您有 Cucumber 故事和 RSpec 模型规范,那就足够了。
    【解决方案2】:

    就个人而言,我在使用 Cucumber 时从不使用视图规范。对我来说,验收测试更有意义,而且我的复杂视图通常以 Javascript 为中心,无法使用视图规范进行测试。

    【讨论】:

      【解决方案3】:

      永远不要将视图规范用于任何事情。 Cucumber 故事——甚至是 RSpec 集成测试——做得更好。 bobocopy 给出的例子对于他假设的情况来说是很好的例子,但它们应该被纳入 Cucumber 故事/集成测试中,而不是单独存在。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-18
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-14
        • 2010-12-30
        相关资源
        最近更新 更多