ruby-on-rails - 我什么时候应该在 Cucumber 和 RSpec 工作流中单独测试 View ?

标签 ruby-on-rails ruby rspec cucumber bdd

经过一段时间的 Cucumber 和 RSpec BDD,我意识到我的许多 Cucumber 功能只是更高级别的 View 测试。

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

以这个场景为例

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"

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

我接近 Cucumber 是不是错了? 我究竟应该在 View 规范中测试什么?

我应该为每个单独的 View 编写它们吗,例如测试像这样的操作的 View

def show
  @project = current_user.projects.first
end

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

最佳答案

在 RSpec 中永远不应该测试 View 是一种被广泛接受(在我看来是不正确的)的 Cucumber 理念。争论是因为 View 的行为可以在 Cucumber 中描述,RSpec 应该坚持它最了解的东西——模型和 Controller 。

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

例如:

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

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

tl;dr:查看规范用于与其他开发人员交流契约(Contract),应该谨慎使用(但仍然应该使用)。

关于ruby-on-rails - 我什么时候应该在 Cucumber 和 RSpec 工作流中单独测试 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4463253/

相关文章:

ruby - 实例化 capybara 浏览器并设置代理

java - 对来自 jruby 的内部 java 方法调用设置 rspec 期望

ruby - 如何让Ruby部分解析源码?

ruby-on-rails - 如何全局忽略 UTF-8 字符串中的无效字节序列?

ruby-on-rails - 使用 RSpec 和 FactoryGirl 测试模型中的 Rails 类方法的正确方法是什么?

ruby-on-rails - 带有 Rspec 的 Nokogiri

ruby-on-rails - Ruby on Rails 错误 bundler

ruby-on-rails - Rails/paperclip 的新手 - Paperclip 不会保存

ruby-on-rails - 没有数据库的注册或邀请电子邮件验证

ruby-on-rails - 为什么我可以将随机代码添加到我的 Ruby 类定义中?