Ruby on rails 如何在rspec capybara测试规范中使用哈希变量

Ruby on rails 如何在rspec capybara测试规范中使用哈希变量,ruby-on-rails,rspec,capybara,Ruby On Rails,Rspec,Capybara,我的规范文件: require 'spec_helper' describe "State Contracts page" do @state_data = { :state_slug => 'Alabama', :state_name => 'California' } before(:each) { visit state_path(:state=>"#{@state_data[:state_slug]}" )} it 'should ha

我的规范文件:

require 'spec_helper'

describe "State Contracts page" do 
  @state_data = {
   :state_slug => 'Alabama', 
   :state_name => 'California'
  }

 before(:each) { visit state_path(:state=>"#{@state_data[:state_slug]}" )}

 it 'should have header' do
   page.should have_content("#{@state_data[:state_name]} Contracts")
 end

# show statistics specification for State Contract
 it "should have #{@state_data[:state_name]} Statistics details" do
    page.should have_content("#{@state_data[:state_name]} Statistics") 
    page.should have_content('Total Obligated Amount')
    page.should have_content('Total Transactions')
    page.should have_content('Total Contractors')
    page.should have_content('Total Contract Recipients')
    page.should have_content('Total Offers')
  end
end

# show State link  
it "should have visible #{@state_data[:state_name]} Links" do
    page.should have_content("#{@state_data[:state_name]} Links")
    assert_equal(true, find_link("Agencies in #{@state_data[:state_name]}").visible?)
    assert_equal(true, find_link("Contractors in "{@state_data[:state_name]}").visible?)
    assert_equal(true, find_link("Contracts in #{@state_data[:state_name]}").visible?)
  end
end
运行测试后,出现下一个错误:

undefined method `[]' for nil class for "#{@state_data[:state_name]}"

我想我正在插值散列变量,但现在没有正确的方法。

it
块中使用实例变量时,必须在
之前的
中声明它。在(:each)
块之前将
@state\u数据
包装在
中,它应该可以工作

它将如下所示:

before do
  @state_data = {
    :state_slug => 'Alabama', 
    :state_name => 'California'
  }
  visit state_path(:state=>"#{@state_data[:state_slug]}"
end

我的理解是,使用实例变量被认为是反模式,应该考虑使用<代码>()< <代码> > <代码>主题()>代码>代替

使用
let()
会将此更改为:

let(:state_data) do
  { 
    :state_slug => 'Alabama', 
    :state_name => 'California'
  }
end

before { visit state_path(:state=>"#{state_data[:state_slug]}" }

it 'should have header' do
  page.should have_content("#{state_data[:state_name]} Contracts")
end

descripe
块中定义的局部变量或实例变量在任何包含的
it
块中都是不可访问的

如果要使任意变量或方法在多个
it
块中可用,则需要使用
let
let
之前编码>或
let
方法允许您记忆helper方法,而
before
方法允许您在执行
it
块之前执行任意Ruby代码。
subject
方法也可用作定义
subject
助手的方法

当然,您也可以在每个
it
块中定义方法或变量