我应该何时在Cucumber和RSpec工作流程中单独测试视图?

Jak*_*old 7 ruby bdd rspec ruby-on-rails cucumber

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

当我开始编写我的场景然后转到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"
Run Code Online (Sandbox Code Playgroud)

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

我接近黄瓜错了吗?我究竟应该在视图规格中测试什么?

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

def show
  @project = current_user.projects.first
end
Run Code Online (Sandbox Code Playgroud)

或者我应该只测试更复杂的视图?

bob*_*opy 8

这是一种被广泛接受的(在我看来,不正确的)黄瓜哲学,观点永远不应该在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
Run Code Online (Sandbox Code Playgroud)

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

tl; dr:查看规范用于将合同传达给其他开发人员,应谨慎使用(但仍应使用).