在Capybara中使用Given / Let w / Feature / Scenario

时间:2013-07-25 17:08:48

标签: ruby-on-rails ruby rspec capybara

我想使用“given”(或“let”)设置一个变量,该变量可以通过spec.rb文件中的所有“功能”访问。我该怎么做呢? “给定”声明应该放在文件中的哪个位置?谢谢!

require 'spec_helper'

feature "Home page" do
  given(:base_title) { "What Key Am I In?" }
  scenario "should have the content 'What Key Am I In?'" do
    visit '/static_pages/home'
    expect(page).to have_content('What Key Am I In?')
  end

  scenario "should have the title 'What Key Am I In? | Home'" do
    visit '/static_pages/home'
    expect(page).to have_title("#{base_title}")
  end

  scenario "should not have a custom page title | Home'" do
    visit '/static_pages/home'
    expect(page).not_to have_title("| Home")
  end  
end

feature "About page" do
  scenario "should have the content 'About'" do
    visit '/static_pages/about'
    expect(page).to have_content('About')
  end

  scenario "should have the title 'What Key Am I In? | About'" do
    visit '/static_pages/about'
    expect(page).to have_title('What Key Am I In? | About')
  end
end

2 个答案:

答案 0 :(得分:8)

given/let次调用位于feature/describe/context块的顶部,适用于所有包含的feature/describe/contextscenario/it块。在您的情况下,如果您有两个单独的feature块,则需要将它们放在更高级feature/describe/context块中,并将要应用的given/let个调用放在所有feature块中。更高的水平。

引用在RSpec中使用的水豚文档:

  

describe ..., :type => :feature实际上只是background的别名,beforescenario的别名,itgiven/given!的别名,   和let/let!的{​​{1}}别名。

此外,在RSpec中,describe块(无论是通过describecontext还是Capybara别名feature表示)都可以任意嵌套。相比之下,在Cucumber中,feature只能存在于规范的顶层。

您可以通过Google“rspec nested describe”获取更多信息。

答案 1 :(得分:0)

您必须在context中使用feature来解决您的问题。

feature 'Static page' do
  given(:base_title) { "What Key Am I In?" }

  context 'Home page' do
    # code
  end

  context 'About page' do
    # code
  end
end

两个旁注:

  1. 将两个功能块放在一个文件中并不好
  2. Capybara DSL中没有context的别名,您可以直接使用它。